<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Paul Preibisch</title>
    <description>The latest articles on DEV Community by Paul Preibisch (@paulpreibisch).</description>
    <link>https://dev.to/paulpreibisch</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F900712%2Fd344538b-5a93-44cf-8413-c533f59b5f25.jpg</url>
      <title>DEV Community: Paul Preibisch</title>
      <link>https://dev.to/paulpreibisch</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/paulpreibisch"/>
    <language>en</language>
    <item>
      <title>Sick of WordPress?</title>
      <dc:creator>Paul Preibisch</dc:creator>
      <pubDate>Thu, 05 Sep 2024 17:39:37 +0000</pubDate>
      <link>https://dev.to/paulpreibisch/sick-of-wordpress-5god</link>
      <guid>https://dev.to/paulpreibisch/sick-of-wordpress-5god</guid>
      <description>&lt;p&gt;Last year, I launched several websites using WordPress, one of which was a Community Events site. On that site, I wanted to implement Event Booking functionality. I spent four months purchasing a variety of plugins to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Optimize the site&lt;/li&gt;
&lt;li&gt;Enhance SEO&lt;/li&gt;
&lt;li&gt;Generate sitemaps&lt;/li&gt;
&lt;li&gt;Log site activity&lt;/li&gt;
&lt;li&gt;Add and manage events&lt;/li&gt;
&lt;li&gt;Enable booking&lt;/li&gt;
&lt;li&gt;Create a newsletter system&lt;/li&gt;
&lt;li&gt;Optimize images&lt;/li&gt;
&lt;li&gt;Track visitor data&lt;/li&gt;
&lt;li&gt;Showcase a gallery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While I was able to accomplish all of this, it came at a high cost—not just financially, but in terms of time and effort. Managing and maintaining multiple plugins, ensuring compatibility, and customizing them to meet my exact needs was a daunting task. In the end, I had spent over $2,000 on plugins and subscriptions alone!&lt;/p&gt;

&lt;p&gt;That experience led me to search for a better solution. As a PHP developer with over 1,800 hours of Laravel experience, I felt frustrated using such a slow, resource-heavy platform like WordPress. It felt like an expensive, opaque black box where the inner workings were a mystery.&lt;/p&gt;

&lt;p&gt;This summer, I made the switch to &lt;strong&gt;Statamic&lt;/strong&gt;, a flat-file-based content management system built on top of Laravel. Unlike WordPress, Statamic doesn't rely on a database, which makes it faster, more secure, and easier to manage. It’s built with modern development in mind, giving developers full control over their site's functionality without the need for bloated plugins. &lt;/p&gt;

&lt;p&gt;Statamic simplifies complex tasks with its intuitive control panel, while offering the flexibility of using Laravel’s robust framework. No more hunting down and maintaining dozens of plugins just to make the site function. Everything, from creating events to managing content and optimizing performance, is much easier and more streamlined.&lt;/p&gt;

&lt;p&gt;So far, I’m loving the switch, and I'll continue updating this post with more insights into my journey with Statamic.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Enhancing Your Experience with WP-Events Manager: Insights and Suggestions</title>
      <dc:creator>Paul Preibisch</dc:creator>
      <pubDate>Thu, 29 Feb 2024 05:55:28 +0000</pubDate>
      <link>https://dev.to/paulpreibisch/before-you-buy-wp-events-manager-these-3-things-need-to-be-improved-d7p</link>
      <guid>https://dev.to/paulpreibisch/before-you-buy-wp-events-manager-these-3-things-need-to-be-improved-d7p</guid>
      <description>&lt;p&gt;Dear Community,&lt;/p&gt;

&lt;p&gt;I hope this message finds you well. As someone who passionately teaches Salsa Dance in a picturesque beach town in Mexico, I've embarked on a journey that bridges cultures and continents. My unique path—from a Canadian learning Latin dance in Korea, to sharing these vibrant rhythms with both tourists and locals in Mexico—highlights the universal language of dance. Interestingly, while my lessons cater mainly to tourists, it's fascinating to see the cultural exchange unfold, especially since the local dance flavor, Cumbia, differs from the "L.A. Style" Salsa I teach, known locally as "Linia" or "Casino Style".&lt;/p&gt;

&lt;p&gt;This cultural tapestry led me to leverage WP-Events Manager for my website, aiming to create a hub for Latin Dance events. Investing in their comprehensive bundle was a decision made with the intent to offer the best to my audience. However, my experience has surfaced opportunities for enhancement within the platform that I believe are crucial for potential users to consider.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Optimization of Event Listings: The current setup where event listings significantly slow down website performance due to the lack of optimized thumbnail support is a critical area for improvement. Implementing a feature for automatic thumbnail optimization or allowing users to upload optimized images could drastically enhance site speed and user experience.

Management of Expired Events: The handling of expired events presents a challenge, especially when it affects the visibility of past events and their SEO value. A refined approach, such as introducing settings to manage the visibility of expired event details without cluttering current listings, could greatly benefit both organizers and attendees, preserving the SEO efforts and enabling historical event exploration.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;As I continue to navigate these challenges, I remain hopeful for future updates that will address these concerns, enriching the WP-Events Manager platform for all its users. I look forward to sharing more insights and developments in the coming months and eagerly anticipate the enhancements that WP-Events Manager will introduce to improve our collective experience.&lt;/p&gt;

&lt;p&gt;Warm regards&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Create the Best Linux shortcut to move your windows between workspaces</title>
      <dc:creator>Paul Preibisch</dc:creator>
      <pubDate>Thu, 16 Nov 2023 00:35:17 +0000</pubDate>
      <link>https://dev.to/paulpreibisch/create-the-best-linux-shortcut-to-move-your-windows-between-workspaces-49gi</link>
      <guid>https://dev.to/paulpreibisch/create-the-best-linux-shortcut-to-move-your-windows-between-workspaces-49gi</guid>
      <description>&lt;p&gt;What I love about linux and the gnome desktop, are all the great customization powerups available.&lt;/p&gt;

&lt;p&gt;One of my main go-to's is to configure the keys&lt;/p&gt;

&lt;p&gt;super+shift+left = move window to left monitor&lt;br&gt;
super+shift+right = move window to right monitor&lt;br&gt;
super+shift+down = move window to lower WORKSPACE&lt;br&gt;
super+shift+up = move window to upper WORKSPACE&lt;/p&gt;

&lt;p&gt;To do this, open settings-&amp;gt;keyboard-shortcuts&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ec7XeB5i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8vzgu9ie7ey8evaj6b8l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ec7XeB5i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8vzgu9ie7ey8evaj6b8l.png" alt="Image description" width="800" height="635"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;next, look for:&lt;br&gt;
"move window to lower workspace"&lt;br&gt;
"move window to upper workspace"&lt;br&gt;
"move window to rightward monitor"&lt;br&gt;
"move window to leftward monitor"&lt;/p&gt;

&lt;p&gt;and set a shortcut key for each one.&lt;/p&gt;

&lt;p&gt;Now moving your screens around will be much easier in Linux.&lt;/p&gt;

&lt;p&gt;By the way, I am using PopOS 22.04&lt;br&gt;
I love it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IsT3Jewx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/br345k9qkmunkp3e2d03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IsT3Jewx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/br345k9qkmunkp3e2d03.png" alt="Image description" width="800" height="81"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Linux User living in Latin America? Install this Command-Line translator!</title>
      <dc:creator>Paul Preibisch</dc:creator>
      <pubDate>Sun, 22 Oct 2023 20:54:27 +0000</pubDate>
      <link>https://dev.to/paulpreibisch/linux-user-living-in-latin-america-install-this-command-line-translator-fa2</link>
      <guid>https://dev.to/paulpreibisch/linux-user-living-in-latin-america-install-this-command-line-translator-fa2</guid>
      <description>&lt;p&gt;Wow, my brain is totally blown today!  Currently, I am living in Latin America as a digital nomad, and discovered an amazing command line translator for Linux!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;translate-shell
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next edit your ~/.zsrc or ~/.bashrc&lt;br&gt;
and add the following environmental vars&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SOURCE_LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;en
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;TARGET_LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;es
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now apply changes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can translate!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;trans bueno
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Use -I for interactive mode)&lt;/p&gt;

&lt;p&gt;Get more help here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;man trans
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/cgzCJINeWI8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>opensource</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Create a Laravel App to export a Spreadsheet with a Dropdown</title>
      <dc:creator>Paul Preibisch</dc:creator>
      <pubDate>Sun, 27 Aug 2023 20:22:34 +0000</pubDate>
      <link>https://dev.to/paulpreibisch/create-a-laravel-app-to-export-a-spreadsheet-with-a-dropdown-3nla</link>
      <guid>https://dev.to/paulpreibisch/create-a-laravel-app-to-export-a-spreadsheet-with-a-dropdown-3nla</guid>
      <description>&lt;p&gt;So cool! Due to an example I posted earlier on dev.to,&lt;br&gt;
a community member reached out to me on LinkedIn, and asked if I could provide an example.  Here is a Start To Finish example on how to programmatically create downloadable spreadsheets using Laravel excel WITH drop downs.&lt;/p&gt;

&lt;p&gt;In this article I will explain how to create am Excel Spreadsheet using Laravel with Drop-down menus on a column.&lt;/p&gt;

&lt;p&gt;You may view the code here:&lt;br&gt;
&lt;a href="https://github.com/paulpreibisch/laravelExcelDropdownExample"&gt;https://github.com/paulpreibisch/laravelExcelDropdownExample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This example will pull drop-down data from a separate sheet within the Workbook so we can get around Excels 256 character data limit for drop-downs.&lt;/p&gt;

&lt;p&gt;My example spreadsheet lists two sheets: Dogs, Dog Type&lt;br&gt;
The type cell in each row of the Dog sheet, will provide a drop-down of dog types, which is pulled from the second sheet in the workbook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pu-DT_Ns--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q5v61y4cy2tt9lnw2vy7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pu-DT_Ns--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q5v61y4cy2tt9lnw2vy7.png" alt="Image description" width="778" height="575"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Environment Setup:
&lt;/h2&gt;

&lt;p&gt;First, lets create a Laravel application to house our drop-down example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer create-project laravel/laravel exampleLaravelExcelDropdowns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check if it is up and running&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;exampleLaravelExcelDropdowns
php artisan serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3QfS4Hq---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ypxj35pwtkcn2owzrb62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3QfS4Hq---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ypxj35pwtkcn2owzrb62.png" alt="Image description" width="635" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Composer Requirements
&lt;/h3&gt;

&lt;p&gt;Lets add our requirements: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Laravel Excel&lt;/li&gt;
&lt;li&gt;friendsofphp/php-cs-fixer (so we can clean our code as we go using &lt;code&gt;./vendor/bin/php-cs-fixer fix .&lt;/code&gt;)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require maatwebsite/excel
friendsofphp/php-cs-fixer  

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Register the Laravel Excel config&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan vendor:publish &lt;span class="nt"&gt;--provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Maatwebsite&lt;/span&gt;&lt;span class="se"&gt;\E&lt;/span&gt;&lt;span class="s2"&gt;xcel&lt;/span&gt;&lt;span class="se"&gt;\E&lt;/span&gt;&lt;span class="s2"&gt;xcelServiceProvider"&lt;/span&gt; &lt;span class="nt"&gt;--tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are some nice default settings in excel.php so check it out. You can change things such as the document properties of each Excel File generated etc:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0NJS5oab--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/897zmzn4mtbmqri7fe18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0NJS5oab--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/897zmzn4mtbmqri7fe18.png" alt="Image description" width="703" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Controller
&lt;/h3&gt;

&lt;p&gt;Now, Lets add a DogController in &lt;code&gt;App/Http/controllers/DogController.php&lt;/code&gt; and add an endpoint so the Excel Spreadsheet can be downloaded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Http\Controllers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Exports\Excel\DogExport&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Maatwebsite\Excel\Facades\Excel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DogController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;downloadImportTemplate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nv"&gt;$dogWorkbook&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DogWorkbook&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Excel&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;download&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$dogWorkbook&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'DogImportTemplate.xlsx'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Routing
&lt;/h3&gt;

&lt;p&gt;Now, let's add a route to our Controller function in &lt;code&gt;web.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/dogs/downloadImportTemplate'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;DogController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'downloadImportTemplate'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  The Spreadsheet
&lt;/h1&gt;

&lt;p&gt;The Spreadsheet will contain two sheets:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0NMTTllo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6j7qtyz5w1kzg3ikao1k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0NMTTllo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6j7qtyz5w1kzg3ikao1k.png" alt="Image description" width="736" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Dog Sheet
&lt;/h3&gt;

&lt;p&gt;On this sheet, we will populate the collection with some example dogs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Exports\Excel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Maatwebsite\Excel\Concerns\FromCollection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Maatwebsite\Excel\Concerns\WithHeadingRow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Maatwebsite\Excel\Concerns\WithStyles&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Maatwebsite\Excel\Concerns\WithTitle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PhpOffice\PhpSpreadsheet\Cell\DataValidation&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PhpOffice\PhpSpreadsheet\Worksheet\Worksheet&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DogSheet&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;FromCollection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;WithHeadingRow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;WithStyles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;WithTitle&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;SHEET_TITLE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Dogs'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'type'&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="s1"&gt;'id'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Midnight'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s1"&gt;'dog_type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Black Fell Terrier'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="s1"&gt;'id'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Celeste'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s1"&gt;'dog_type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Husky Mix'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="s1"&gt;'id'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Renata'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s1"&gt;'dog_type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Shepard Mix'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Worksheet&lt;/span&gt; &lt;span class="nv"&gt;$sheet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$validation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$sheet&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getCell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'C1'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getDataValidation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;setType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DataValidation&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;TYPE_LIST&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setErrorStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DataValidation&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;STYLE_INFORMATION&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setAllowBlank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setShowInputMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setShowErrorMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setShowDropDown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setErrorTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Input error'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Value is not in list.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setPromptTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Pick from list'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setPrompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Please pick a value from the drop-down list.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setFormula1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'\''&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nc"&gt;DogTypesSheet&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;SHEET_TITLE&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'\'!$A$2:$A$10000'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setSqref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"C1:C10000"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;SHEET_TITLE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dog Types Sheet
&lt;/h3&gt;

&lt;p&gt;Now Lets make the other sheet which will be used to populate the dropdown&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Exports\Excel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Maatwebsite\Excel\Concerns\FromCollection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Maatwebsite\Excel\Concerns\WithHeadingRow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Maatwebsite\Excel\Concerns\WithStyles&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Maatwebsite\Excel\Concerns\WithTitle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PhpOffice\PhpSpreadsheet\Cell\DataValidation&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PhpOffice\PhpSpreadsheet\Worksheet\Worksheet&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DogTypesSheet&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;FromCollection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;WithHeadingRow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;WithTitle&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;SHEET_TITLE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Dog Types"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="s1"&gt;'Type'&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="p"&gt;[&lt;/span&gt;

                    &lt;span class="s1"&gt;'Black Fell Terrier'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="p"&gt;[&lt;/span&gt;
                    &lt;span class="s1"&gt;'Husky Mix'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="p"&gt;[&lt;/span&gt;
                   &lt;span class="s1"&gt;'Shepard Mix'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;SHEET_TITLE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Workbook
&lt;/h3&gt;

&lt;p&gt;Finally, Ill create the Workbook that contains the two sheets, and is downloaded via our controller endpoint&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Exports\Excel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Maatwebsite\Excel\Concerns\WithMultipleSheets&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DogWorkbook&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;WithMultipleSheets&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;DogSheet&lt;/span&gt; &lt;span class="nv"&gt;$dogSheet&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;DogTypesSheet&lt;/span&gt; &lt;span class="nv"&gt;$dogTypesSheet&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;DogSheet&lt;/span&gt; &lt;span class="nv"&gt;$dogSheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;DogTypesSheet&lt;/span&gt; &lt;span class="nv"&gt;$dogTypesSheet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;dogSheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$dogSheet&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;dogTypesSheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$dogTypesSheet&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;sheets&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s2"&gt;"Dogs"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;dogSheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;"DogTypes"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;dogTypesSheet&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, point your browser to:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://127.0.0.1:8001/dogs/downloadImportTemplate"&gt;http://127.0.0.1:8001/dogs/downloadImportTemplate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And you should see the template in action!&lt;/p&gt;

&lt;p&gt;I hope this helps.&lt;/p&gt;

&lt;p&gt;P.S.&lt;/p&gt;

&lt;p&gt;I just got asked to create a new Workbook, with the Columns:&lt;br&gt;
Name, Type, Breed&lt;/p&gt;

&lt;p&gt;I am to add a dropdown for the Type column where the user can choose the values "Dog" or "Cat".  If they choose "Dog" then another dropdown in Column "Breed", should list all the dogs breeds.  But if the user chooses "Cat", then the dropdown should show all the Cats Breeds.&lt;/p&gt;

&lt;p&gt;I've Updated the git repo now, and once downloaded, you can go to&lt;br&gt;
&lt;a href="http://127.0.0.1:8001/animals/downloadTemplate"&gt;http://127.0.0.1:8001/animals/downloadTemplate&lt;/a&gt;&lt;br&gt;
to see the desired behavior.&lt;br&gt;
I will create another blog post this week to explain how I did it!&lt;/p&gt;

&lt;p&gt;Cheers!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Workflow Optimization</title>
      <dc:creator>Paul Preibisch</dc:creator>
      <pubDate>Sat, 26 Aug 2023 17:51:01 +0000</pubDate>
      <link>https://dev.to/paulpreibisch/most-common-daily-use-of-phpstorm-4fj4</link>
      <guid>https://dev.to/paulpreibisch/most-common-daily-use-of-phpstorm-4fj4</guid>
      <description>&lt;p&gt;For the last year, I've logged 1800 hours coding in Laravel using PhpStorm as my main IDE, on my PopOs Linux box. Some ways I've optimized my workflow are listed below. I'd love to hear what you do to optimize your workday as well:&lt;/p&gt;

&lt;h2&gt;
  
  
  Shortcuts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Pinning/Unpinning Tabs (Control-p, Control-shift-p)&lt;/em&gt;
Often times, when working on three or four files, I pin them so they don't get lost in the sea of other files I open along the way&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X8fIRSiP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ixw77tqyto39kkgn2b2z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X8fIRSiP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ixw77tqyto39kkgn2b2z.png" alt="Image description" width="574" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Save as Live Templates&lt;/em&gt;
Recently, I have been using live templates more and more, especially to help populate factory attribute lists when writing unit tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;[ 'project_id' =&amp;gt; $this-&amp;gt;project-&amp;gt;getKey()]&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Compare With Branch&lt;/em&gt;
If you click on a folder, then control-shift-a to search for actions, type in "Compare with Branch..."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AfiZb24M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/thjwgqlhml4bcjty1ll6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AfiZb24M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/thjwgqlhml4bcjty1ll6.png" alt="Image description" width="436" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This lets you easily see how your changes compares with your "staging" / "master" branch.  Whats nice is, when you switch branches, you can press the refresh button to update the list&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;PhpStorm squash commits&lt;/code&gt;, &lt;code&gt;git push --force&lt;/code&gt;
Before submitting a PR, I often squash all my commits to remove developer noise and provide a clean mearge for my code 
reviewer&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  PhpStorm Plugins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Quick Notes
The quick notes plugin is an absolute MUST have, great way to take notes right within your IDE:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mbZzT2ZG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xtgjl7mpc9f4arvgytq9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mbZzT2ZG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xtgjl7mpc9f4arvgytq9.png" alt="Image description" width="406" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Git Commands
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git checkout -&lt;/code&gt;&lt;br&gt;
Checkout the last branch I was working on&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git stash / git stash apply&lt;/code&gt; (in PhpStorm - Unstash changes)&lt;br&gt;
This allows me to stash my current work if an urgent bug comes up that needs attending. Then I unstash (git stash apply) when I am able to return.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t47fkHD1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sip9oklplnh9mgsfs4w5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t47fkHD1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sip9oklplnh9mgsfs4w5.png" alt="Image description" width="461" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker Commands
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker-compose-exec composer dump-autoload&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I use this after I rename (refactor) a class file so that composer knows it exists&lt;/p&gt;

&lt;h2&gt;
  
  
  Bash Aliases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fix&lt;/code&gt;
This command is an alias which I added to my .bash_aliases so I can easily clean my code before pushing to the repo:
&lt;code&gt;alias fix="./vendor/bin/php-cs-fixer fix --verbose --show-progress=none --using-cache=yes"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Artisan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;artisan route:clear
after adding new API routes, I run this to ensure cache is updated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you like, let me know what some of your daily command / shortcut go-to's you find yourself using over and over again. I'd be curious to hear how you optimize your work day as well.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Prevent Data Entry Duplicates in Real-time, using Laravel Excel</title>
      <dc:creator>Paul Preibisch</dc:creator>
      <pubDate>Sun, 06 Aug 2023 04:32:12 +0000</pubDate>
      <link>https://dev.to/paulpreibisch/how-to-add-a-formula-to-prevent-duplicates-in-laravel-excel-2pap</link>
      <guid>https://dev.to/paulpreibisch/how-to-add-a-formula-to-prevent-duplicates-in-laravel-excel-2pap</guid>
      <description>&lt;p&gt;Over the past year, I have been tasked with creating several Downloadable Excel Spreadsheets so that Clients can more easily import data into our system.&lt;/p&gt;

&lt;p&gt;The data model we are importing into however, uses the unique validation rule on one of the columns. I've added code on the back-end to catch this error, however I thought it would be nice to try and prevent it in the first place.&lt;/p&gt;

&lt;p&gt;To do so, I analyzed some of the recipes PhpSpreadSheet uses to create Dropdowns for a user, and noticed they are using the Data Validation feature of Excel.  &lt;/p&gt;

&lt;p&gt;From this, I was able to create a function which notifies the user that a duplicate has been entered.&lt;/p&gt;

&lt;p&gt;I have the following in a trait called &lt;code&gt;sheetHelper&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PhpOffice\PhpSpreadsheet\Cell\DataValidation&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PhpOffice\PhpSpreadsheet\Worksheet\Worksheet&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;preventDuplicates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$column&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;Worksheet&lt;/span&gt; &lt;span class="nv"&gt;$sheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$startRow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$errorMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;?int&lt;/span&gt; &lt;span class="nv"&gt;$endRow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;static&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$startCell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$column&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$startRow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$endRow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$endRow&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nv"&gt;$sheet&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getHighestRow&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$endCell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$column&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$endRow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//specified large number to include all cells up to&lt;/span&gt;

    &lt;span class="nv"&gt;$validation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$sheet&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getCell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$startCell&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getDataValidation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;setType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nc"&gt;DataValidation&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;TYPE_CUSTOM&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setErrorStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nc"&gt;DataValidation&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;OPERATOR_EQUAL&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setAllowBlank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setShowInputMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setShowErrorMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setShowDropDown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setErrorTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$errorMessage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setFormula1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'=COUNTIF($A$3:$A$10000,$A3)=1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//$A$3 is absolute value, $A3 is absolute column, relative row 3&lt;/span&gt;

    &lt;span class="nv"&gt;$validation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setSqref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$startCell&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$endCell&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function can be used in your Exported Sheet. Just implement the WithStyles interface, and place it in the styles method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Worksheet&lt;/span&gt; &lt;span class="nv"&gt;$sheet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$sheet&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;preventDuplicates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$sheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;startRow&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="c1"&gt;//we use row 1 for the header&lt;/span&gt;
        &lt;span class="n"&gt;errorMessage&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Name already exists in this column'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;endRow&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt; 
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, if a user enters a duplicated name in column 'A', a popup in Excel / Libre Office will appear notifying them that a duplicate name has been entered.  It will then remove the text they entered.&lt;/p&gt;

&lt;p&gt;The key values I used to get this to work was setting the SerrorStyle to &lt;code&gt;DataValidation::OPERATOR_EQUAL&lt;/code&gt;, and setting the type to &lt;code&gt;DataValidation::TYPE_CUSTOM&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Happy Coding!&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>excel</category>
      <category>phpspreadsheets</category>
      <category>duplicates</category>
    </item>
    <item>
      <title>Ensure Nvidia settings on restored on reboot - PopOs 22.04</title>
      <dc:creator>Paul Preibisch</dc:creator>
      <pubDate>Mon, 31 Jul 2023 04:20:59 +0000</pubDate>
      <link>https://dev.to/paulpreibisch/ensure-nvidia-settings-on-restored-on-reboot-popos-2204-4kj9</link>
      <guid>https://dev.to/paulpreibisch/ensure-nvidia-settings-on-restored-on-reboot-popos-2204-4kj9</guid>
      <description>&lt;p&gt;I struggled NVidia on my Linux box for for years. On every reboot / disconnection of my Laptop, Nvidia settings would reset.  &lt;/p&gt;

&lt;h2&gt;
  
  
  My Setup
&lt;/h2&gt;

&lt;p&gt;2 display ports, and 1 HDMI port on my laptop = 4 displays.&lt;/p&gt;

&lt;p&gt;The steps to have these set to specific orientations on startup are:&lt;/p&gt;

&lt;p&gt;1) capture the current configuration from the xorg.conf file&lt;br&gt;
2) write a script that writes the orientation/location/main monitor settings via nvidia-settings command line option&lt;br&gt;
3) run the script at startup&lt;/p&gt;

&lt;h1&gt;
  
  
  Let's begin:
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1) Capture the current configuration
&lt;/h2&gt;

&lt;p&gt;Open the nvidia GUI through your OS, or via the command-line by typing: nvidia-settings.&lt;/p&gt;

&lt;p&gt;Next, click "X Servier Display Configuration" set the orientation and location of each display, and the main display.&lt;/p&gt;

&lt;h2&gt;
  
  
  2) Grab the X Configuration settings
&lt;/h2&gt;

&lt;p&gt;A popup appears, click "Show Preview"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YuMAppLp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/accipoyjmr44ifn3zb44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YuMAppLp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/accipoyjmr44ifn3zb44.png" alt="Image description" width="544" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the preview text into an editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  3) Search for &lt;code&gt;nvidiaXineramaInfoOrder&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;We will set &lt;code&gt;XineramaInfoOrder&lt;/code&gt; in the script below to this value&lt;/p&gt;

&lt;h2&gt;
  
  
  4) Search for &lt;code&gt;metamodes&lt;/code&gt;. We will set &lt;code&gt;CurrentMetaMode&lt;/code&gt; in the script below with this value
&lt;/h2&gt;

&lt;h2&gt;
  
  
  5) Write the Script:
&lt;/h2&gt;

&lt;p&gt;So I created a script using the above attributes and the values from the xorg preview:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir ~/bin
cd ~/bin
sudo nano nvidiaStartup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now paste in the command:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nvidia-settings --assign &amp;lt;attributeName&amp;gt;="&amp;lt;your setting from xorg.conf"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;example:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash
nvidia-settings --assign CurrentMetaMode="DP-0: nvidia-auto-select +0+0, HDMI-0: nvidia-auto-select +0+1050, DP-1: nvidia-auto-select +1920+1080, DP-3: nvidia-auto-select +4480+1080 {rotation=right}"
nvidia-settings --assign XineramaInfoOrder="DP-1"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  6) Set startup applications
&lt;/h2&gt;

&lt;p&gt;Next, set the permissions of the script&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo chmod u+x ~/bin/nvidiaStartup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;To access start startup settings:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gnome-session-properties
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TUEPpm08--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/676tyh83bx4bbjaqsont.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TUEPpm08--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/676tyh83bx4bbjaqsont.png" alt="Image description" width="713" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;gnome-session-properties&lt;/p&gt;

&lt;p&gt;press add&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---YICC5EG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/szmyjjcfm75vdczxmekq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---YICC5EG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/szmyjjcfm75vdczxmekq.png" alt="Image description" width="723" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now it will start up each time you load your OS.&lt;/p&gt;

&lt;p&gt;To test it simply type&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sh nvidiaStartup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Hope this helps!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>PhpStorm Open Search Results in a new Tab</title>
      <dc:creator>Paul Preibisch</dc:creator>
      <pubDate>Fri, 26 May 2023 23:59:08 +0000</pubDate>
      <link>https://dev.to/paulpreibisch/phpstorm-open-search-results-in-a-new-tab-205l</link>
      <guid>https://dev.to/paulpreibisch/phpstorm-open-search-results-in-a-new-tab-205l</guid>
      <description>&lt;p&gt;I found this tip on from &lt;a href="https://www.wpdiaries.com/phpstorm-settings/#search-results"&gt;WordPress Diaries&lt;/a&gt;, run by &lt;a href="https://www.wpdiaries.com/about/"&gt;Sergey Korolev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I am re-posting it here as it is a great PHPStorm Tip: &lt;/p&gt;

&lt;p&gt;By default: when you search in PhpStorm (⌘ ⇧ F on Mac or Ctrl Shift F on Windows) and click the button Open in New Window in the search window, the results are shown in the same tab every time (overwriting each other). So you can not switch between the current and previous search results quickly. You need to search again instead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PPD7-Qgs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yu4kht92e3b11nlo6zgk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PPD7-Qgs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yu4kht92e3b11nlo6zgk.png" alt="Image description" width="768" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How to change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run the search (⌘ ⇧ F on Mac or Ctrl Shift F on Windows)&lt;/li&gt;
&lt;li&gt;Click the button Open in New Window on the bottom right of the search window&lt;/li&gt;
&lt;li&gt;Right-click on a tab in the search results&lt;/li&gt;
&lt;li&gt;Select View Options &amp;gt; Open Results in New Tab&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>View All changed files in Branch in PhpStorm</title>
      <dc:creator>Paul Preibisch</dc:creator>
      <pubDate>Wed, 01 Feb 2023 16:57:04 +0000</pubDate>
      <link>https://dev.to/paulpreibisch/phpstorm-powerup-add-changes-to-right-sidebar-22h9</link>
      <guid>https://dev.to/paulpreibisch/phpstorm-powerup-add-changes-to-right-sidebar-22h9</guid>
      <description>&lt;p&gt;Hi everyone, I found a great PhpStorm Power User Tip today which will enable you easily view files ALL files changed in the current branch you are working on while in PhpStorm.&lt;/p&gt;

&lt;p&gt;USECASE:&lt;/p&gt;

&lt;p&gt;You are working on a feature/bug branch off of your staging branch, and you want to see all files changes within the feature/bug branch from staging.&lt;/p&gt;

&lt;p&gt;1) click on the top folder of your project in project files&lt;br&gt;
2) press control-shift-a for the actions popup&lt;br&gt;
3) type "compare with branch" (if it doesn't show up, checkbox 'include disabled actions'&lt;br&gt;
4) Voila! The Changes tab is now available!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F208iyj4gbuixcbbk5tum.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F208iyj4gbuixcbbk5tum.png" alt="Image description" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cryptocurrency</category>
      <category>crypto</category>
      <category>web3</category>
      <category>offers</category>
    </item>
    <item>
      <title>PhpStorm Plugin Picks</title>
      <dc:creator>Paul Preibisch</dc:creator>
      <pubDate>Mon, 23 Jan 2023 17:10:39 +0000</pubDate>
      <link>https://dev.to/paulpreibisch/phpstorm-plugin-pick-19ll</link>
      <guid>https://dev.to/paulpreibisch/phpstorm-plugin-pick-19ll</guid>
      <description>&lt;p&gt;Hi everyone,  since July 30, 2022, I have 818 hours logged programming with the latest version of Laravel, and PhpStorm spending an average of 7 hours 9m per day. Exlcuding weekends, my daily average is around 8 hours per day.&lt;/p&gt;

&lt;p&gt;During this time, I have come across several PhpStorm plugins that make my programming day a delight, and would like to share some of them with you. Today, I will share a few of them, and will do a follow up post with more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://plugins.jetbrains.com/plugin/7425-wakatime" rel="noopener noreferrer"&gt;1) WakaTime&lt;/a&gt;&lt;br&gt;
Wakaktime is an INDISPENSABLE tool for time tracking.&lt;br&gt;
What I love about it is that it tracks how much time you spend in each branch, per project.  I do love RescueTime as well, but RescueTime does not track time per branch.  Branch time tracking really helps when reporting how much time you spent on each feature / bug fix.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe41msfrgpl3sunzj0qby.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe41msfrgpl3sunzj0qby.png" alt="Image description" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgt3c0xg9opzp1u5tym6v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgt3c0xg9opzp1u5tym6v.png" alt="Image description" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2s3a53ncosmbukouvujj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2s3a53ncosmbukouvujj.png" alt="Image description" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://plugins.jetbrains.com/plugin/index?xmlId=com.chylex.intellij.inspectionlens&amp;amp;utm_source=product&amp;amp;utm_medium=link&amp;amp;utm_campaign=PS&amp;amp;utm_content=2022.3" rel="noopener noreferrer"&gt;2) Inspection Lens&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This plugin is great, as it prints code error inspections right within your editor in red. This can helps save time by identifying problems while coding in a very direct and clear manner. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgeho9jrxdqjscfv1ibdn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgeho9jrxdqjscfv1ibdn.png" alt="Image description" width="800" height="76"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://plugins.jetbrains.com/plugin/4456-quick-notes" rel="noopener noreferrer"&gt;3) Quick Notes&lt;/a&gt;&lt;br&gt;
Quick Notes is another plugin I love, as it provides a very useful and available note pad you can use while you are programming. This is especially useful during Team meetings when talking to a PM, or another team mate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4501i5hwnq775in20c2n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4501i5hwnq775in20c2n.png" alt="Image description" width="800" height="747"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4) &lt;a href="https://plugins.jetbrains.com/plugin/index?xmlId=net.rentalhost.plugins.php.hammer&amp;amp;utm_source=product&amp;amp;utm_medium=link&amp;amp;utm_campaign=PS&amp;amp;utm_content=2022.3" rel="noopener noreferrer"&gt;PHPHammer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PhpHammer provides 47 inspections to help identify problem areas in your code which are not available natively in PHPStorm.  It will suggest ways to optimize and clean up &lt;br&gt;
your code, as your write logic in real time.&lt;/p&gt;

&lt;p&gt;5) &lt;a href="https://plugins.jetbrains.com/plugin/index?xmlId=com.drinchev.projectlabel&amp;amp;utm_source=product&amp;amp;utm_medium=link&amp;amp;utm_campaign=PS&amp;amp;utm_content=2022.3" rel="noopener noreferrer"&gt;Project Label&lt;/a&gt; is also a neat plugin that adds a Colored Textual Label at the bottom of PHPStorm with the name of your project. This is handy when when switching between multiple projects within your organization. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1r88nab73yw2r18cwga.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1r88nab73yw2r18cwga.png" alt="Image description" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope these help, more to come!&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>PhpStorm Shortcut for php-cs-fixer</title>
      <dc:creator>Paul Preibisch</dc:creator>
      <pubDate>Wed, 09 Nov 2022 15:38:45 +0000</pubDate>
      <link>https://dev.to/paulpreibisch/phpstorm-shortcut-for-phpfixer-50po</link>
      <guid>https://dev.to/paulpreibisch/phpstorm-shortcut-for-phpfixer-50po</guid>
      <description>&lt;p&gt;PhpFixer has become an essential tool to ensure our team's coding standards are kept in line.&lt;/p&gt;

&lt;p&gt;Rather than run "/vendor/friendsofphp/php-cs-fixer/php-cs-fixer fix" each time from the command line before a commit&lt;/p&gt;

&lt;p&gt;I configured the command as an "External Tool" called "fix" in PhpStorm, and assigned it to 'ctrl-alt-shift-l" in PhpStorm.&lt;/p&gt;

&lt;p&gt;Now all I need to do is press the hotkey combination while programming to clean up my code before a commit!&lt;/p&gt;

&lt;p&gt;Good luck!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M1YxZXc9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5j7g4lsyayqy0bonfhk9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M1YxZXc9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5j7g4lsyayqy0bonfhk9.png" alt="Image description" width="800" height="701"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IbsVX0TQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/446fgggx2vdiajilmwfr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IbsVX0TQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/446fgggx2vdiajilmwfr.png" alt="Image description" width="800" height="610"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dFr4cNvx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5dzyq2s8l54jwkddbu6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dFr4cNvx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5dzyq2s8l54jwkddbu6.png" alt="Image description" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
