<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>پست‌های انتشارات محتوای طراحی وب</title>
        <link>https://virgool.io/web-design/feed</link>
        <description>در این انتشارات محتواهای مرتبط با طراحی وب (شامل سیستم‌های مدیریت محتوا، فروشگاه‌های اینترنتی و کدنویسی) و همچنین سئو (SEO) قرار می‌گیرد.</description>
        <language>fa</language>
        <pubDate>2026-04-14 10:42:08</pubDate>
        <image>
            <url>https://files.virgool.io/upload/publication/rmpw9n4w4e2m/ppsps1.png</url>
            <title>محتوای طراحی وب</title>
            <link>https://virgool.io/web-design</link>
        </image>

                    <item>
                <title>ابزار آنالیز وب ماتومو (Matomo)</title>
                <link>https://virgool.io/web-design/%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D8%A2%D9%86%D8%A7%D9%84%DB%8C%D8%B2-%D9%88%D8%A8-%D9%85%D8%A7%D8%AA%D9%88%D9%85%D9%88-matomo-f6i0xnepkdkk</link>
                <description>ماتومو (Matomo) یک ابزار آنالیز وب منبع باز است که به کسب و کارهای اینترنتی کمک می کند تا اطلاعات مربوط به رفتار بازدیدکنندگان سایتشان را به دست آورند. این ابزار با استفاده از فناوری بصری، به شما کمک می کند تا رفتار کاربران خود را در هنگام تعامل با سایتتان مشاهده کنید.ابزار آنالیز وب ماتومو (Matomo)ماتومو دارای طیف وسیعی از ویژگی ها است که به شما کمک می کند تا رفتار کاربران خود را به طور عمیق درک کنید. برخی از مهم ترین ویژگی های این ابزار عبارتند از:نقشه گرمایی (Heatmap): نقشه گرمایی به شما نشان می دهد که کاربران روی کدام قسمت های سایت شما کلیک می کنند، می رانند و می گذرانند. این اطلاعات به شما کمک می کند تا عناصر سایت خود را که بیشترین توجه را به خود جلب می کنند شناسایی کنید.ضبط بازدید (Session Recordings): ضبط بازدید به شما امکان می دهد تا نحوه تعامل کاربران با سایت خود را به صورت ویدیویی مشاهده کنید. این اطلاعات به شما کمک می کند تا مشکلات احتمالی در تجربه کاربری سایت خود را شناسایی کنید.گزارش ها (Reports): ماتومو طیف وسیعی از گزارش ها را ارائه می دهد که به شما کمک می کند تا عملکرد سایت خود را از جنبه های مختلف ارزیابی کنید.ادغام با سایر ابزارها (Integrations): ماتومو با سایر ابزارهای محبوب مانند وردپرس، جوملا و ووکامرس ادغام می شود. این ادغام ها به شما کمک می کند تا داده های ماتومو را با داده های سایر ابزارها به راحتی ترکیب کنید.ماتومو برای انواع کسب و کارهای اینترنتی از جمله فروشگاه های آنلاین، وب سایت های خبری، وب سایت های آموزشی و غیره مناسب است. این ابزار به شما کمک می کند تا تجربه کاربری (UX) سایت خود را بهبود ببخشید و نرخ تبدیل خود را افزایش دهید.مزایا و معایب ماتومو (Matomo)مزایا:ابزار منبع بازقابلیت استفاده آسانارائه طیف وسیعی از ویژگی هاامکان ادغام با سایر ابزارهامعایب:نیاز به دانش فنی برای نصب و پیکربندیامکان ذخیره داده ها در سرورهای خودتفاوت ماتومو و هات جارهات جار و ماتومو هر دو ابزارهای آنالیز وب هستند که به شما کمک می کنند تا رفتار کاربران خود را در هنگام تعامل با سایتتان مشاهده کنید. با این حال، بین این دو ابزار تفاوت هایی وجود دارد.هات جار Hotjarابزار تجاریقابلیت استفاده آسانارائه طیف وسیعی از ویژگی هاامکان ادغام با سایر ابزارهاهزینه اشتراکماتومو Matomoابزار منبع بازقابلیت استفاده آسانارائه طیف وسیعی از ویژگی هاامکان ادغام با سایر ابزارهانیاز به دانش فنی برای نصب و پیکربندیامکان ذخیره داده ها در سرورهای خوددر نهایت، انتخاب بهترین ابزار آنالیز وب برای شما به نیازها و بودجه شما بستگی دارد. اگر به دنبال یک ابزار آنالیز وب هستید که به شما امکان دهد رفتار کاربران خود را به طور عمیق درک کنید و از داده های خود به طور کامل استفاده کنید، ماتومو یک گزینه عالی است. اگر به دنبال یک ابزار آنالیز وب هستید که به راحتی قابل استفاده باشد و طیف وسیعی از ویژگی ها را ارائه دهد، هات جار یک گزینه عالی است.جمع بندیماتومو یک ابزار قدرتمند برای آنالیز وب است که به شما کمک می کند تا رفتار کاربران خود را به طور عمیق درک کنید. این ابزار منبع باز است و به شما امکان می دهد داده های خود را در سرورهای خود ذخیره کنید. اگر به دنبال یک ابزار آنالیز وب هستید که به شما امکان دهد رفتار کاربران خود را به طور عمیق درک کنید و از داده های خود به طور کامل استفاده کنید، ماتومو یک گزینه عالی است.</description>
                <category>محتوای طراحی وب</category>
                <author>امین انصاری</author>
                <pubDate>Fri, 03 Nov 2023 16:20:08 +0330</pubDate>
            </item>
                    <item>
                <title>نصب وردپرس در اوبونتو</title>
                <link>https://virgool.io/web-design/%D9%86%D8%B5%D8%A8-%D9%88%D8%B1%D8%AF%D9%BE%D8%B1%D8%B3-%D8%AF%D8%B1-%D8%A7%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-e59ksyqd9erm</link>
                <description>سلاممن چند وقت هست که دیگه برای کدنویسی از ویندوز استفاده نمیکنم و اومدم سراغ لینوکس. اوایل چندان باهاش راحت نبودم اما کم کم بهش عادت کردم. الان دیگه جوری شده که نمیتونم از ویندوز برای کد نویسیم استفاده کنم.برای استفاده از لینوکس دلایل زیادی داشتم که حتی چنتاش شخصی هم بود. اما یکی از این دلایل این بود که میخواستم ببینم عملکرد PHP که از ریشه ساخته شده برای لینوکس چقدر میتونه با ویندوز متفاوت باشه، که دیدم خیلی متفاوتهتوی این مقاله سعی کردم از ابتدایی ترین چیزها رو بگم که هرکسی بتونه همه چیو صحیح و درست نصب کنه که مشکلی نداشته باشه. توی ویندوز یه xampp یا wamp یا... رو نصب میکنیم و همه چی آمادست اما توی لینوکس باید تک تک همه چیو نصب کنیم.اول از هر کاری، که دستور آپدیت رو اجرا کنید که لیست پکیج هاتون آپدیت بشه:sudo apt-get updateحالا باید Apache رو نصب کنیم. خب برای نصب Apache اسم پکیجش apache2 هست. پس:sudo apt-get install apache2آپاچی هیچ سوالی نمیپرسه و خیلی پسر خوبیه و خودش نصب میشهحالا که آپاچی رو نصب کردید، تست کنید ببینید درست نصب شده باشه که من تا حالا توی این قسمت مشکلی نداشتم. اگه درست باشه باید وقتی توی مرورگر آدرس localhost رو میزنید، صفحه ای مشابه زیر براتون باز بشه:اگه این صفحه رو توی مرورگر دیدید یعنی آپاچی درست نصب شدهبعد از اون باید PHP رو نصب کنیم. نصب PHP هم مثل آپاچی سادست و اسم پکیجش هم php هست. اما وقتی این پکیج رو میزنید از آخرین نسخه که توی ریپازیتوری اوبونتو هست استفاده میکنه که آخرین نسخه منتشر شده PHP هست و اتوماتیک اونو نصب میکنه اما درصورتیکه میخواستید نسخه خاصی رو نصب کنید، اسم پکیجش به این صورت میشه: php7.x حالا جای این x میتونید از 0 تا هر نسخه ای که منتشر شده قرار بدید.(آخرین نسخه فعلا 7.4 هست که میشه: php7.4)sudo apt-get install phpپکیج php ماژول های مختلفی رو همراه خودش داره. برای اینکه بتونید لیستش رو ببینید، کافیه دستور زیر رو بزنید:php -mخب قاعدتا هر چی کمتر ماژول نصب باشه سرعت بالاتر میره. اما خب خیلی نگران سرعت نباشید. این لینوکسه! هر چی دوست دارید نصب کنید د:اما اگه میخوایید از همین الان ماژول هایی که ممکنه بعدا موقع نوشتن پلاگین و قالب نیازتون بشه رو نصب کنید، اینها پیشنهاد من هستن: php-cli php-json php-mbstring php-mysql php-xml php-xmlrpc php-zipالبته خب این لینوکسه! میتونید بعدا هم نصبشون کنید.یادتون باشه بعد از اینکه ماژول ها رو نصب کردید یا اصلا ماژول هم نصب نکردید و فقط php رو نصب کردید،‌ حتما باید سرویس apache2 رو ریستارت کنید. بعدا اگه ماژول دیگه ای نصب کردید هم باید برای فعال شدنش حتما اینکارو انجام بدید.sudo service apache2 restartحالا یه فایل php توی پوشه/var/www/html/بسازید و تست کنید که کار کنه برای تست تابع phpinfo() رو تست کنید که با یه تیر دو هدف رو زده باشید.(ببینید ماژول ها کار میکنن)اما برنامه سوم که باید نصب کنیم، MySQL. نصب این برنامه مثل اون دوتا دیگه سادست و فقط یه مرحله اضافه دارهاسم پکیجش mysql-server هست. پس:sudo apt-get install mysql-serverیه چیزی که یادتون باید باشه، اینه که حتما ماژول php-mysql هم نصب باشهیه بار دیگه apache رو ریستارت کنید تا همه چی اوکی باشهخب حالا میرسیم به بخش اصلی کانفیگ MySQL. دستور زیر رو اجرا کنید تا نصب اصلی MySQL شروع بشه:sudo mysql_secure_installationاولین چیزی که ازتون میخواد اینه که رمز روت دیتابیس رو وارد کنید: Enter current password for root (enter for none): اینتر رو بزنید.بعد از اون ازتون میپرسه میخواین برای روت رمز بزارید؟(Set root password?) شما Y رو وار کنید و اینتر رو بزنید.حالا یه رمزی رو وارد کنید و حتما اینتر رو بزنید. رمز رو یادتون نره که عوض کردن رمز روت دردسر دارهبعد از اون چهارتا سوال ازتون میپرسه که همه رو Y وارد کنید.اگه آخر کار بهتون پیام های All done! و Thanks for using MariaDB! رو نمایش داد یعنی نصبش تموم شده.خب حالا وارد MySQL میشیم و یه دیتابیس برای وردپرس میسازیم:sudo mysql -uroot -pرمز روت رو هر چی که گذاشتید وارد کنید تا بهتون عبارت:mysql&gt;رو نمایش بده. حالا کوئری ساخت دیتابیس رو بنویسید:یادتون باشه کوئری های MySQL حتما باید با ; تموم بشن تا اجرا بشن.create database wordpress;البته به جای wordpress میتونید هر اسمی که دوست دارید برای دیتابیستون بزارید.اگه موفقیت آمیز باشه باید پیام Query OK, 1 row affected (0.00 sec) رو بهتون بدهخب حالا باید کاربر روت رو به دیتابیس وصل کنیم. دستور زیر رو بزنید:GRANT ALL PRIVILEGES ON wordpress.* TO &#039;root&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;YOURPASSWORD&#039;;یادتون باشه که به جای YOURPASSWORD حتما رمزتون رو وارد کنید.حالا هم دستور زیر رو بزنید که همه چی اوکی بشه:FLUSH PRIVILEGES;حالا میتونید از MySQL خارج بشید. دستور exit رو داریم، کلید ctrl + D رو هم میتونید بزنید.خب حالا بریم سراغ نصب وردپرس. اول از همه وارد پوشه روت سرور بشید که کارهای مختلفی داریم:cd /var/www/htmlخب الان باید وردپرس رو دانلود کنیم:sudo wget http://wordpress.org/latest.tar.gzدانلودش که تموم شد، این فایل فشرده هست و با دستور زیر از حالت فشرده درش بیارید:sudo tar xzf latest.tar.gzالان فایل های وردپرس توی یه پوشه به نام wordpress قرار دارن. انتخاب با خودتونه که میخواید فایل ها رو بیارید توی روت سرور یا نه. اگه میخواید دستورش اینه:sudo mv wordpress/* .خب قبل از اینکه وارد قسمت نصب خود وردپرس بشیم، دستور تغییر کاربر فایلها رو اجرا کنید:sudo chown -R www-data: .
sudo chown -R www-data: ./*برا شروع عملیات نصب خودکار وردپرس. توی مرورگر آدرس:localhostیا:localhost/wordpressرو بزنید.مراحل نصب وردپرس رو خیلی عادی برید جلو و فکر نکنم اینجا نیازی به توضیح داشته باشه، به جز قسمت اطلاعات دیتابیس که اطلاعات اینها هست:Database name:    wordpressUsername:             rootpassword:             YOURPASSWORDatabase hodt:     localhostیکی از منابع:Build a LAMP Web Server with WordPress</description>
                <category>محتوای طراحی وب</category>
                <author>محمدجعفر خواجه</author>
                <pubDate>Mon, 03 Aug 2020 17:22:01 +0430</pubDate>
            </item>
                    <item>
                <title>افزایش سرعت وردپرس با بهبود FCP همراه با 10 راهکار موثر</title>
                <link>https://virgool.io/web-design/%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4-%D8%B3%D8%B1%D8%B9%D8%AA-%D9%88%D8%B1%D8%AF%D9%BE%D8%B1%D8%B3-%D8%A8%D8%A7-%D8%A8%D9%87%D8%A8%D9%88%D8%AF-fcp-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D8%A8%D8%A7-10-%D8%B1%D8%A7%D9%87%DA%A9%D8%A7%D8%B1-%D9%85%D9%88%D8%AB%D8%B1-edwdkisygqse</link>
                <description>در اوایل سال 2019 ، گوگل اعلام کرد که افزایش سرعت سایت را با تمرکز روی دو معیار عملکرد ارزیابی می کنند :First Contentful Paint یا FCP First Input Delay  یا FIDاحتمالا تابحال برای بررسی سرعت سایت وردپرسی خود، آن را در PageSpeed ​​Insights بررسی کرده اید.یخش جدید Speed در سرچ کنسول جدید گوگل همچنین از معیارهای FCP و FID برای درجه بندی URL ها استفاده می کند. گوگل فعلا از این دو معیار به عنوان یک ویژگی آزمایشی استفاده می کند.جالب اینجاست که این رتبه بندی فقط براساس یک تست سرعت انجام نمی شود بلکه نشان دهنده سرعت واقعی سایت شما برای کاربران در سراسر جهان است. آمار برای این کار از طریق   Chrome User Experience Report  یا CrUX  از کاربران واقعی جمع آوری می شود .First Contentful Paint یک معیار واقعی تری از تجربه کاربر را ارائه می دهد. سایت شما ممکن است در تست سرعت کمتر از 2 ثانیه بارگیری شود، اما اگر این مورد در اکثر مخاطبان شما اینگونه نباشد ، Google همچنان شما را جریمه می کند. FCP چیست؟First Contentful Paint  یک معیار کاربر محور برای اندازه گیری سرعت سایت است. این معیار چگونگی درک کاربران از عملکرد سایت را اندازه گیری می کند ، نه اینکه یک ابزار تست سرعت اندازه گیری باشد. First Contentful Paint با First Paint متفاوت است. FCP محتوایی برای رندر نیاز دارد. این محتوا می تواند متن ، تصاویر (از جمله تصاویر پس زمینه ، آرم) یا عناصر &lt;canvas&gt; غیر سفید باشد.اگر بخواهیم این معیار را ساده بفهمید، می توانید آن را به عنوان زمانی که کاربر برای دیدن هر محتوا در مرورگر خود نیاز دارد ، درنظر بگیرید. بنابراین ، یک FCP سریع به کاربر اطمینان می دهد که چیزی در حال بارگذاری است و احتمال اینکه منتظر بارگذاری سایت باشند، بیشتر می شود.چگونه FCP را اندازه گیری کنیم؟FCP را می توان با ابزارها  و تجربه استفاده واقعی (داده های میدانی) اندازه گیری کرد. در اینجا چند ابزار که شما می توانید از آن برای اندازه گیری این معبار استفاده کنید، معرفی شده است:LighthouseWebPageTestChrome DevToolsPageSpeed InsightsChrome User Experience ReportFirebase Performance Monitoring (beta) گوگل 75 درصد بارگذاری صفحات سایت شما را  اندازه می گیرد که به دو بخش دستگاه موبایل و دسک تاپ تقسیم شده است.  نمره خوب FCP چیست؟براساس Google ، این معیار باید در مدت زمان 1 ثانیه اتفاق بیفتد . این یک تجربه کاربری خوب را برای بازدید کنندگان سایت شما فراهم می کند.اگر FCP سایت شما 3+ ثانیه طول بکشد ، گوگل سرعت سایت را کند می دانید. طبق تحقیقات ، بیش از 53٪ از کاربران تلفن همراه در صورتی که زمان بارگیری صفحه بیش از 3 ثانیه، سایت را ترک می کنند. بنابراین این معیار را جدی بگیرید.راهکارهایی برای افزایش سرعت وردپرس با بهبود FCP1. کاهش زمان پاسخگویی سرور (TTFB)زمان پاسخگویی سرور یا Time to First Byte یا TTFB  مدت زمانی است که  اولین بایت محتوای صفحه توسط مرورگر دریافت می شود.چگونه سرعت سایت وردپرس را افزایش دهیم:با کاهش TTFBاولین قدم برای رسیدن به بهبود FCP و بالا بردن سرعت سایت وردپرس ، بهبود TTFB است.FCP = TTFB + Content Load Time + Render Timeاز آنجا که FCP بسیار وابسته به TTFB است ، این مهمترین عاملی است که برای بهینه‌سازی برای بهبود FCP لازم دارید.در مقاله ای جداگانه درمورد کاهش زمان TTFB پرداخته خواهدشد، ولی بطور خلاصه می توانید از موارد زیر برای کاهش TTFB استفاده کنید:استفاده از یک هاست سریعاستفاده از پوسته و افزونه های به روزرسانی شدهکاهش پرس و جو (queryها)استفاده از کش (caching)استفاده از CDNاستفاده از DNS اختصاصی 2. منابع Render-Blocking را از بین ببریدروش بعدی برای افزایش سرعت وردپرس این است که منابع Render-Blocking را از بین برد.یک سند HTML شامل تگ های مختلفی است که همه آنها به سرعت توسط اکثر مرورگرها تجزیه و تحلیل می شوند، اما در تجزیه CSS و JS اینگونه نیست.به طور معمول ، مرورگر سعی می کند ابتدا همه عناصر صفحه را بارگیری کند ، همه آنها را تجزیه و بعد صفحه وب را رندر کند. در بیشتر مواقع ، اندازه اسناد HTML به نسبت شیوه های CSS و اسکریپت های JS کمتر است. تعداد منابع CSS و JS نیز معمولاً بیشتر است.بنابراین ، هنگامی که کاربر درخواست یک صفحه وب می کند ، مرورگر محتوای HTML را قبلاً دریافت کرده است ، اما هنوز منتظر بارگذاری سایر منابع دیگر قبل از نمابش صفحه است. در نتیجه ،  به آنها منابع Render-Blocking گفته می شود .از این رو ، برای بهبود FCP ، باید این منابع بازدارنده را از بین ببرید. می توانید این کار را از طریق روش های زیر انجام دهید:Inline  کردن منابع بحرانیابتدا اسکریپت های مهم و استایل (style)های لازم برای رندر منابع بحرانی صفحه موردنظر را شناسایی کنید. در اینجا یک راهنمای ساده توسط گوگل در مورد چگونگی شناسایی منابع بحرانی آورده شده است.پس از شناسایی اسکریپت های مهم ، باید آنها را از منبع Render-Blocking حذف کنید و سپس آنها را در صفحه HTML خود توسط برچسب های &lt;script&gt; و &lt;style&gt; اینلاین (Inline) کنید.با این کار اطمینان حاصل می کنید که صفحه وب هنگام بارگیری به هر آنچه برای هندل کردن عملکرد اصلی خود نیاز دارد، داشته باشد.منابع غیر بحرانی را به تعویق بیندازیدبرای منابع غیر بحرانی، شما باید URLهای را با صفات async یا defer مشخص کنید.اضافه کردن صفت defer به urlهای اسکریپت های غیربحرانی توصیه شده است. با این کار مرورگر فایل اسکریپت را پس تجزیه کامل سند HTML، اجرا می کند.برای مثال:&lt;script defer src=&quot;https://v3b4d4f5.rocketcdn.me/path/to/file/script.js&quot;&gt; &lt;/script&gt;اضافه کردن صفت async به urlهای استایل غیربحرانی توصیه شده است.  این به مرورگر می گوید که استایل ها را بصورت غیر همزمان بارگیری کند در حالی که مرورگر بارگیری سایر عناصر صفحه را بدون وقفه ادامه می دهد.استایل های بارگذاری شده با تگ &lt;link&gt; هیچ راهی مستقیم برای اعمال صفت  async ندارد. اما راه حلی وجود دارد:&lt;!-- Setting “media” type as ‘print’ forces the browser to load the stylesheet asynchronously. On full page load, the media type is changed to ‘all’ so that the stylesheet gets applied. --&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; media=&quot;print&quot; onload=&quot;this.media=&#x27;all&#x27;&quot;&gt;&lt;!-- Fallback for when JavaScript is disabled, but in this case CSS can’t be loaded asynchronously. --&gt;&lt;noscript&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot;&gt;&lt;/noscript&gt;تنظیم کردن نوع print برای media باعث می شود تا مرورگر استایل رابطور همزمان بارگیری کند. در بارگذاری کامل صفحه ، نوع media به “all” تغییر می یابد تا استایل اعمال شود. هر چیزی را که بلا استفاده است، حذف کنیدهنگام شناسایی منابع مهم ، ممکن است کدی را پیدا کنید که در صفحه وب استفاده نمی شود. حذف هر کد بلااستفاده به شما در بهینه سازی صفحه وب کمک می کند.اگر تغییر کد برای شما راحت نیست، می توانید از افزونه ای مانند WP Rocket برای تعویق پرونده های JavaScript غیر بحرانی با تنها چند کلیک استفاده کنید.همانطور که در 2 تصویر زیر مشاهده می کنید، درصورت انجام اصولی این تنظیم در wp rocket، تاثیر زیادی روی First Contentful Paint خواهد داشت و باعث افزایش سرعت وردپرس خواهدشد:قبل از اعمال defer در wp rocketبعد از اعمال defer در wp rocket که باعث بالا بردن سرعت سایت وردپرس شدشما همچنین می توانید تحویل CSS را با WP Rocket بهینه کنید تا استایل های Render-Blocking حذف شود. قسمت بعدی این ویژگی را پوشش می دهد.3. تولید مسیر CSS بحرانی (Critical Path CSS) و Inline کردن آنروش سوم برای افزایش سرعت وردپرس،  Inline کردن css های بحرانی است.اگر CSS را برای بارگذاری به طور غیر همزمان تنظیم کرده باشید ، مرورگر قبل از بارگیری استایل های موردنیاز ، محتوای سبک دهی نشده را به کاربران نشان می دهد. این رفتار با عنوان Flash of Unstyled Content  یا FOUC شناخته شده است و یک تجربه ناخوشایند برای کاربران است.برای جلوگیری از FOUC ، باید Critical Path CSS را تولید کرده و مستقیماً درون پرونده HTML خود وارد کنید. اما دقیقا Critical Path CSS چیست؟تجزیه و تحلیل مسیر رندر بحرانی مرورگر به صورت دستی و سپس تولید Critical Path CSS یک روند خسته کننده است.با این وجود ، می توانید از ابزارهای آنلاین رایگان مانند Pegasaas برای تولید Critical Path CSS استفاده کنید. این ابزار برای اکثر موارد کاملاً مناسب است. برای اطلاعات بیشتر درمورد عملکرد مسیر تحلیلی بحرانی Google را بررسی کنید .پس از ایجاد Critical Path CSS ، باید آن را درون سند HTML وارد کنید. الان مرورگر می تواند بلافاصله قسمت اول صفحه وب را بدون منتظر ماندن برای بارگذاری استایل های CSS به طور غیر همزمان ارائه دهد. این کار باعث بهبود قابل توجه First Contentful Paint می شود.از طرف دیگر ، می توانید از WP Rocket برای خودکار سازی این فرآیند استفاده کنید.استفاده از wp rocket برای تولید Critical Path CSS و بهبود FCP و بهبود سرعت وردپرسفعال کردن تنظیمات بهینه سازی تحویل CSS در WP Rocket باعث ایجاد Critical Path CSS برای صفحات سایت وردپرسی شما می شود  و در صورت بروز هرگونه سفارشی سازی یا تغییر پوسته، به طور خودکار Critical Path CSS نیز بروزرسانی می شود. 4. از عناصر مبتنی بر اسکریپت بالا بپرهیزیدروش چهارم برای بالا بردن سرعت سایت وردپرس، این است که کمتر از اسکریپت هایی مثل جاوا اسکریپت در سایت مخصوصا در بالای سایت استفاده کنید.هرچقدر جاوا اسکریپت را خوب بهینه کنید ، اما در مقایسه با پردازش ساده HTML کندتر است. هر چیزی که به JS نیاز داشته باشد می تواند بر First Contentful Paint تأثیر منفی بگذارد.در حالی که می توانید اسکریپت های مهم را Inline کنید ، آنها هنوز نیاز به بارگیری و تجزیه دارند. وقتی صحبت از بهبود FCP می شود ، هر میلی ثانیه حساب می شود. بسیاری از پوسته ها شامل عناصر فانتزی در بالای صفحه هستند که از اسکریپت های زیادی استفاده می کنند. همین قضیه در مورد استفاده از صفحه سازهایی که استایل ها و اسکریپت های غیرضروری زیادی اضافه می کنند، صادق است. از این رو ، پوسته سایت خود را عاقلانه انتخاب کنید. استفاده از یک پوسته سریع و خوب کدنویسی شده مانند GeneratePress یا Astra می تواند به بهبود First Contentful Paint بطور قابل توجه کمک کند. به عنوان یک قاعده کلی ، سعی کنید از این عناصر در بالای سایت خود، خودداری کنید:انیمیشن های سنگین از هر نوعافزونه های اسلایدرافزونه های رسانه های اجتماعی یا اشتراک گذاریافزونه های مگا منوجاسازی‌هایی (Embed) مانند Google Ads 5- از بارگیری تنبل (lazy load) در عکس های بالای صفحه پرهیز کنیداز آنجایی که تصاویر نقشی پر رنگ در سایت ها دارند، روشی که معمولا برای افزایش سرعت وردپرس می شود، استفاده از بارگذاری تنبل است.بارگیری تنبل (Lazy Load) یکی از ساده ترین راه ها برای سرعت بخشیدن به سایت شما است ، به خصوص اگر سایتی با تصویر سنگین دارید.از نظر فنی ، بارگذاری تنبل اسکریپتی است که از بارگیری تصاویر و فریم هایی که هنوز در نمای مرورگر قابل مشاهده نیستند ، جلوگیری می کند. هنگامی که کاربر به پایین پیمایش می کند ، تصاویر در هنگام مشاهده بارگیری می شوند.از آنجا که بارگذاری تنبل قبل از رندرکردن مرورگر ، نیاز به استفاده از JavaScript دارد ، می تواند First Contentful Paint شما را به تاخیر بیاندازد.از این رو ، شما باید تصاویر موجود در بالا را از بارگذاری تنبل محروم کنید.بیشتر پلاگین های بارگیری تنبل محبوب در حال حاضر شامل این ویژگی هستند. در حالت ایده آل ، به دنبال یک افزونه بارگذاری تنبل باشید که به شما امکان می دهد تصاویر را نه تنها با نام فایل موردنظر، بلکه با استفاده از برچسب های دیگر مانند class ، id ، attribute یا تصاویر از یک دامنه خاص حذف کنید. برای مثال برای محروم کردن تصاویر با class موردنظر، کافی است کد زیر را در functions.php استفاده کنید:function rocket_lazyload_exclude_class( $attributes ) {$attributes[] = &#039;class=&amp;quotنام کلاس&amp;quot&#039;;add_filter( &#039;rocket_lazyload_excluded_attributes&#039;, &#039;rocket_lazyload_exclude_class&#039; );return $attributes;}فقط درنظر داشته باشید بجای نام کلاس، کلاس موردنظر را واردکنید.در مقاله ای جداگانه درمورد روش های غیرفعال سازی Lazy load در تصاویر خاص پرداخته خواهدشد. WP Rocket از غیرفعال کردن بارگیری تنبل بر روی تصاویر خاص پشتیبانی می کند . می توانید آن را برای تصویر ، کلاس تصویری ، براساس منبع تصویر و حتی آواتارها غیرفعال کنید. توجه: بارگذاری تنبل تصاویر به هسته وردپرس اضافه شده و از وردپرس 5.5 به بعد به یک ویژگی بومی تبدیل می شود. همچنین از این فیلترها برای شخصی سازی رفتار بارگذاری تنبل استفاده می کند. 6. قرار دادن تصاویر ضروری بصورت Inlineیکی از راهکارهای دیگر برای افزایش سرعت سایت وردپرسی، استفاده از تصاویر با فرمت SVG یا Base64 بصورت Inline می باشد.HTML و CSS راهی را برای شما فراهم می کنند که بتوانید تصاویر را با استفاده از فرمت های Base64 یا SVG بگنجانید. به این داده های URI داده می شود .با قراردادن این نوع تصاویر در بالای صفحه، مرورگر برای بارگیری آنها نیازی به درخواست HTTP اضافی ندارد. این می تواند به بهبود FCP کمک کند.قراردادن تصاویر بالای صفحه بصورت base64 یا SVG برخی از رایج ترین تصاویر بالای صفحه که می توانید بصورت Inline قراردهید عبارتند از:لوگوشمایل (جستجو ، رسانه های اجتماعی ، و غیره)تصویر بنرپس زمینه تصاویر Base64 و SVG چیست؟Base64 یک الگوریتم رمزگذاری است که هر نوع داده از جمله تصاویر را به متن تبدیل می کند. می توانید تصاویر رمزگذاری شده Base64 را مستقیماً در پرونده های HTML یا CSS جاسازی کنید. این یک روش عالی برای سرعت بخشیدن زمان بارگیری تصاویر کوچک است.Base64 Image Encoder ابزاری عالی برای تبدیل هر نوع تصویر به Base64 است. این ابزار از فرمت های تصویر JPEG ، PNG ، WebP ، SVG و BMP. پشتیبانی می کند.تصاویر مهم را Base64 کنید و بصورت inline استفاده کنید &lt;img src=&amp;quotdata:image/jpeg;base64,/uj/…[content]...&amp;quot width=&amp;quot100&amp;quot height=&amp;quot50&amp;quot alt=&amp;quotthis is a base64 image&amp;quot&gt;همچنین می توانید از تصاویر رمزگذاری شده Base64 در CSS استفاده کنید:.custom-class {    background: url(&#039;data:image/jpeg;base64,/9j/…[content]...&#039;);}SVG یک فرمت تصویر برای گرافیک های برداری است. تصاویر SVG اندازه پرونده های کوچکتر دارند ، قابلیت مقیاس دهی به هر اندازه ،بدون از دست دادن کیفیت ، و در همه دستگاه ها عالی به نظر می رسند. اگر تصویر شما دارای اشکال ، منحنی ها و طرح های ساده (مانند آرم ها و نمادها) است ، می توانید بصورت SVG آنها را ذخیره کنید.توجه: استفاده از تصویر SVG به عنوان منبع درون تگ &lt;img&gt; با inline کردن یک تصویر SVG به طور مستقیم از طریق برچسب &lt;svg&gt; متفاوت است .چگونگی Inline کردن  SVG ها در HTML &lt;body&gt;&lt;!-- Insert SVG code here, and the image will show up! --&gt;&lt;svg xmlns=&amp;quothttp://www.w3.org/2000/svg&amp;quot&gt;&lt;circle cx=&#039;50&#039; cy=&#039;25&#039; r=&#039;20&#039;/&gt;&lt;/svg&gt;&lt;/body&gt;این ایده خوبی است که قبل از Inline کردن آنها ، تصاویر خود را فشرده یا minify کنید . اگر تصاویر شما در قالب (JPEG یا PNG) هستند ، از Base64 استفاده کنید. اگر می توان آنها را به قالب برداری تبدیل کرد ، از SVG استفاده کنید.در هر جایی که می توانید از یک URL به عنوان منبع تصویر استفاده کنید ، می توانید تصویر رمزگذاری شده Base64 را در آنجا جایگذاری کنید.اگر تصاویر یا نمادهایی در درون قالب یا افزونه های شما بصورت کدنویسی قرار دارند ، باید آنها را به صورت دستی پیدا کنید و آدرس های منبع آنها را با حالت Inline کردن تصاویر جایگزین کنید. افزونه ای مانند Search &amp; Replace می تواند به شما کمک کند این کار را به راحتی انجام دهید.چندین عیب درمورد Inline کردن تصاویر وجود دارد:اندازه تصاویر را افزایش می دهد (به طور معمول 30٪).اندازه صفحه و در نتیجه TTFB را افزایش می دهد.تصاویر Inlinr شده از طریق CDN قابل تحویل نیست.اگر بتوانید اندازه صفحه را زیر 100 KB نگه دارید ، استفاده از Inline کردن تصاویر زیاد جای نگرانی ندارد. بیشتر از آن ممکن است TTFB شما را تحت تأثیر قرار دهد ، و در نتیجه بجای بهبود  First Contentful Paint ، به آن آسیب برساند.همچنین ، اگر از سرویس هایی مانند Cloudflare  استفاده می کنید ، می توانید آن را برای ذخیره منابع HTML پیکربندی کنید . فعال کردن این ویژگی اگر و فقط اگر بیشتر محتوای سایت شما استاتیک باشد توصیه می شود. 7. اندازه DOM سایت خود را بهینه کنید.یکی از مواردی که باعث کاهش سرعت سایت وردپرس می شود، وجود تعداد زیادی عناصر در صفحه می باشد.Document Object Model یا DOM نمایانگر تمام اشیایی است که یک صفحه وب را تشکیل می دهند. از نظر گرافیکی ، آن را به عنوان درختی با شاخه هایی از گره ها و اشیاء نشان می دهند.نمایش ساختاری DOM اصلاح عناصر آن را با یک زبان اسکریپت نویسی مانند JavaScript آسان می کند.به همه عناصر HTML موجود در درخت DOM گره گفته می شود. گره ها می توانند به چندین عنصر تقسیم شوند ، همه اینها می توانند شاخه شاخه شوند و الی اخر. اینکه چقدر عمق شاخه ها باشد، عمق گره node depth و عمق گره کل درخت DOM ،عمق درخت tree depth گویند . به همه عناصر انشعاب اول یک گره، child elements گفته می شود .داشتن یک درخت DOM بزرگ به دلایل زیادی می تواند FCP شما را تحت تأثیر قرار دهد:یک درخت DOM بهینه نشده شامل گره های زیادی است که در مراحل اولیه بارگذاری صفحه برای کاربر قابل مشاهده نیست.اندازه بزرگ DOM به معنی زمان پردازش بیشتر برای محاسبه و استایل دهی همه گره ها است که هر دو باعث کاهش سرعت رندر می شوند.یک درخت بزرگ DOM همچنین می تواند عملکرد حافظه دستگاه های کاربر را تحت الشعاع قرار دهد.Google صفحات وبی که DOM با شرایط زیر دارد، بعنوان نشانه بد علامت گذاری می کند:بیش از 1500 گره در مجموعداشتن عمق گره بیش از 32گره والدینی parent با بیش از 60 گره childبنابراین یکی از روشهای افزایش سرعت سایت وردپرس، کاهش اندازه DOM است.چگونه اندازه DOM را کاهش دهیم؟به طور کلی ، شما باید فقط  در صورت لزوم گره DOM ایجاد کنید و گره هایی را که لازم نیست از بین ببرید. با این حال ، این نکته در مورد اکثر سایتهای وردپرس صدق نمی کند زیرا ایجاد DOM معمولاً توسط تم ها ، افزونه ها ، صفحه سازها و خود وردپرس انجام می شود.در اینجا چندین نکته برای کمک به شما در کاهش اندازه DOM آورده شده است:صفحات بزرگ را به صفحات کوچکتر تقسیم کنید.استفاده از بارگذاری تنبل برای تعداد زیادی از عناصر HTML ، و نه فقط تصاویر.صفحه بندی اظهار نظر ، پست ، محصولات و غیره.تعداد پست های قابل نمایش در صفحه اصلی و صفحات بایگانی خود را محدود کنید.محتوای ناخواسته را با استفاده از CSS مخفی نکنید. در عوض ، آن را به طور کامل حذف کنید.از استفاده از صفحه سازهایی که بی دلیل تگ های &lt;div&gt; درج می کنند ، خودداری کنید.پوسته های بهینه شده را انتخاب کنید. از افزونه هایی استفاده نکنید که برچسب های &lt;div&gt; زیادی اضافه می کنند (به عنوان مثال ، افزونه های مگامنو ). 8. اطمینان حاصل کنید که متن در طول بارگیری Webfont ها قابل مشاهده استراهکاری دیگر برای جلوگیری از دیر لود شدن سایت وردپرس، مشکل بارگذاری فونت های سفارشی است.فونت ها معمولاً پرونده های بزرگی هستند و زمان بارگذاری را زیاد می کنند. ممکن است با خطایی مانند این در Lighthouse روبرو شوید:Lighthouse  آدرس URL های فونت را به این علت منجر به متن نامرئی می شود، علامت گذاری می کند (منبع: Google )دلیلی وجود دارد که گوگل این رفتار را بعنوان موردی بد، علامت گذاری می کند. برخی از مرورگرها متن رندر نمی شوند تا اینکه همه فونت ها بارگیری شوند. این موجب Flash of Invisible Text یا FOIT می شود .اگر مرورگر را مجبور به اعمال فونت سیستم به هنگام نشان دادن متن، کنید در حالی که فونت های سفارشی در حال بارگذاری هستند ، این مشکل را برطرف می کنید. فقط کافی است به font-face@ ، font-display: swap را اضافه کنید تا تقریباً در همه مرورگرهای مدرن از FOIT جلوگیری شود.در اینجا مثالی از چگونگی استفاده از این روش آورده شده است:@font-face {  font-family: &#039;Pacifico&#039;;  font-style: normal;  font-weight: 400;  src: local(&#039;Pacifico Regular&#039;), local(&#039;Pacifico-Regular&#039;), url(https://fonts.sample.com/pacifico.woff2) format(&#039;woff2&#039;);  font-display: swap;} اگر فونت ها را مستقیماً از CDN وارد می کنید (به عنوان مثال ، فونت های Google) ، می توانید با افزودن پارامتر display=swap&amp; به انتهای URL به همین نتیجه برسید .&lt;link href=&amp;quothttps://fonts.googleapis.com/css?family=Roboto:400,700&amp;display=swap&amp;quot rel=&amp;quotstylesheet&amp;quot&gt;9. استفاده از Resource Hints برای بهبود FCPبه جرات می توان گفت قدرتمند ترین روش افزایش سرعت سایت وردپرسی، استفاده از Resource Hints می باشد.هنگامی که یک کاربر از یک وب سایت بازدید می کند ، مرورگر سند HTML را از سرور درخواست می کند ، آنرا تجزیه می کند ، درخواست های جداگانه ای را برای هر منبع ارجاع شده دیگر ارسال می کند ، و پس از بارگیری و تجزیه همه آنها ، صفحه وب را ارائه می دهد.به عنوان یک توسعه دهنده ، می دانید که کدام منابع برای سایت شما مهمترین هستند. با استفاده از این دانش ، می توانید این منابع مهم را برای بارگذاری درلحظه  مشخص کنید و سرعت بارگذاری صفحه افزایش دهید.برخی از Resource Hints روی منابع موجود در صفحه فعلی اعمال می شود ، در حالی که برخی دیگر روی صفحات بعدی ممکن اعمال شود. تمام Resource Hints برای فعال شدن از ویژگی rel تگ  &lt;link&gt;  استفاده می کنند.DNS Prefetching (پیش تنظیم DNS)اگر سایت شما هرگونه منبعی از وب سایت خارجی بارگیری می کند ، اضافه کردن پارامتر dns-prefetch به مرورگر می گوید ترچمه DNS آدرس URL منابع را در اسرع وقت انجام دهد.در اینجا نحوه اضافه کردن DNS Prefetching به منابع آورده شده است:&lt;link rel=&amp;quotdns-prefetch&amp;quot href=&amp;quot//external-website.com&amp;quot&gt;با WP Rocket می توانید DNS Prefetching  دامنه های خارجی را آسان انجام دهید.اگر سایت شما  از کد زیادی از سایت های دیگر استفاده می کند ، اضافه کردن پارامتر dns-prefetch برای سرعت بخشیدن به بازشدن صفحه بسیار مفید است. می توانید از ابزار رایگان prefetch  برای پیدا کردن دامنه های خارجی که می توانید به لیست dns-prefetch اضافه کنید، استفاده کنید. preConnect (پیش اتصال)preConnect درست مانند DNS Prefetching کار می کند ، درضمن  TCP handshake و TLS negotiation را برقرار می کند (در صورت وجود).مانند این استفاده شود:&lt;link rel=&quot;preconnect&quot; href=&quot;https://example.com&quot;&gt;در نظر داشته باشید که preConnect می تواند زمان پردازش ارزشمندی را بخصوص برای اتصالات ایمن بگیرد. Prefetch (پیش واکشی)اگر مطمئن هستید که سایت در آینده از منبعی از دامنه ای دیگر استفاده خواهد کرد، می توانید به مرورگر پیشنهاد دهید بلافاصله آن را از Prefetch کرده و در مرورگر ذخیره کند. برخلاف DNS Prefetching ، در اینجا به مرورگرگفته می شود بلافاصله بارگذاری منبع را شروع کند.&lt;link rel=&amp;quotprefetch&amp;quot href=&amp;quotscripts.js&amp;quot&gt;اگر فایل درخواستی خیلی بزرگ باشد یا سرعت شبکه کند باشد ، مرورگر می تواند Prefetch را نادیده بگیرد. به عنوان مثال ، Firefox فقط در صورت عدم فعالیت مرورگر ، منابع را Prefetch می کند.Prerender (پیش رندر)این قدرتمند ترین resource hint است. اضافه کردن پارامتر prerender به یک منبع ، مرورگر را مجبور به بارگیری کلیه منابع آن ، تجزیه آنها ، ایجاد درخت DOM ، اعمال استایل ها ، اجرای اسکریپت ها ، رندر صفحه وب و آن را  آماده ارائه می کند. اگر بعداً به URL قرارگرفته در href مراجعه کنید ، صفحه بلافاصله بارگیری می شود.&lt;link rel=&amp;quotprerender&amp;quot href=&amp;quothttps://example.com/next-page&amp;quot&gt;Prerender صفحه اصلی  یک راه عالی برای افزایش نرخ تبدیل است. Preload (پیش بارگذاری)برخلاف prefetch، که بیشتر به عنوان پیشنهادی به مرورگر عمل می کند ، Preload مرورگر را برای بارگیری منابع صرف نظر از آنچه در مورد آنها چه فکری می کند ، هدایت می کند. مرورگر نمی تواند دستورالعمل Preload را نادیده بگیرد.&lt;head&gt;...&lt;link rel=&amp;quotpreload&amp;quot href=&amp;quotstyles.css&amp;quot as=&amp;quotstyle&amp;quot&gt;&lt;link rel=&amp;quotpreload&amp;quot href=&amp;quotui.js&amp;quot as=&amp;quotscript&amp;quot&gt;...&lt;/head&gt;هرچه زودتر مرورگر شروع به درخواست لینک های اعلام شده Preload شده کند ، صفحات سریعتر بارگیری می شوند.وقتی کاربر برای اولین بار به  سایت شما مراجعه می کند ، resource hint کمکی نمی کنند. اما درصورت بازدید صفحات بعدی، بطور قابل توجهی سریعتر ارائه می شود. از آنجا که Google از داده های واقعی برای ارزیابی رتبه بندی سرعت سایت استفاده می کند ، resource hint به بهبود First Contentful Paint  سایت شما کمک می کند.با استفاده از WP Rocket ، می توانید preload و DNS Prefetching را از هر منبعی در صفحات  خود به راحتی اعمال کنید. از طرف دیگر ، می توانید از افزونه های رایگان مانند Pre Party Resource برای فعال کردن دستی resource hint در سایت وردپرسی خود نیز استفاده کنید. 10. از تغییر مسیرها خودداری کنیدیکی دیگر از مواردی که باعث کاهش سرعت سایت وردپرس می شود، تغییر مسیر یا ریدارکت های اضافی است.هنگامی که از URL بازدید می کنید که به URL دیگری هدایت شده است ، سرور کد وضعیت تغییر مسیر HTTP 301 را برمی گرداند. چیزی شبیه به این در کنسول مرورگر شما خواهد بود:HTTP/1.1 301 Moved PermanentlyLocation: /url/to/new/locationیک تغییر مسیر (ریدارکت) مرورگر را مجبور می کند تا درخواست HTTP دیگری را به مکان جدید ارائه دهد. معمولاً ، این بارگذاری صفحه صدها میلی ثانیه تأخیر ایجاد می کند.اگر صفحه شما بیش از یک ریدارکت دارد ، می تواند FCP شما را به میزان قابل توجهی کند بکند.برای جلوگیری از ریدارکت های متعدد ، منابع علامت گذاری شده در گزارش سرعت گوگل را مستقیماً به مقصد نهایی هدایت کنید. علاوه بر این ، اگر منبعی جزئی از مسیر رندرینگ بحرانی (Critical Rendering Path)  صفحه شما باشد ، هر نوع تغییر مسیر منشاء آن را از بین ببرید. جمع بندی افزایش سرعت سایت وردپرسی با بهبود FCPبهبود FCP دیگر یک انتخاب نیست بلکه یک ضرورت است. Google چند وقتی است رتبه بندی سایت ها را بر اساس امتیاز First Contentful Paint  آغاز کرده است. علاوه بر این ، یک FCP سریعتر نیز به تجربه بهتر کاربر منجر می شود.و به زودی چیزهای بهتری می آیند! گوگل قصد دارد یک معیار عملکرد کاربر محور دیگر به نام First Meanful Paint  یا FMP معرفی کند. در حالی که First Contentful Paint زمان ارائه  هر محتوا (مانند لوگو ها ،  تصاویر پس زمینه) اندازه گیری می کند ، FMP پس از بارگیری محتوای مورد نظر توسط کاربر (مثلاً عناوین ، تصاویر cover، متن بدنه) شروع می شود. FMP هنوز استاندارد نشده است ، اما می توانید در مورد آن اطلاعات بیشتری کسب کنید .در این نوشته یاد گرفتید که چگونه با استفاده از تکنیک های مختلف ، بهبود FCP را در وردپرس انجام دهید. خوشبختانه ، با داشتن یک هاست سریع و یک افزونه با عملکرد عالی مانند WP Rocket می توانید سایتی با امتیاز خوب FCP داشته باشید.منبع: ایکارسو</description>
                <category>محتوای طراحی وب</category>
                <author>ikarsoo</author>
                <pubDate>Tue, 23 Jun 2020 11:23:15 +0430</pubDate>
            </item>
                    <item>
                <title>نصب دروپال بر روی vps مرحله سوم</title>
                <link>https://virgool.io/web-design/%D9%86%D8%B5%D8%A8-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-vps-%D9%85%D8%B1%D8%AD%D9%84%D9%87-%D8%B3%D9%88%D9%85-cbmiyqyuwfzc</link>
                <description>drupalنصب دروپال بر روی vps مرحله اولنصب دروپال بر روی vps مرحله دومنصب composer بر روی vpsphp -r &amp;quotcopy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quotHASH=&amp;quot$(wget -q -O - https://composer.github.io/installer.sig)&amp;quotphp -r &amp;quotif (hash_file&#40;&#039;SHA384&#039;, &#039;composer-setup.php&#039;&#41; === &#039;$HASH&#039;) 
{ echo &#039;Installer verified&#039;; } else { echo &#039;Installer corrupt&#039;; unlink&#40;&#039;composer-setup.php&#039;&#41;; } echo PHP_EOL;&amp;quotsudo php composer-setup.php --install-dir=/usr/local/bin --filename=composercomposerنصب drush در ubuntu 18اگر میخواهید آخرین ورژن drush برای شما نصب شود از دستور زیر استفاده کنیدcomposer global require drush/drushبرای نصب drush 8 از دستور زیر استفاده کنیدcomposer global require drush/drush:8اضافه کردن drush به دایرکتوری#path for Drush
sudo nano ~/.bashrc
export PATH=&amp;quot$HOME/.composer/vendor/bin:$PATH&amp;quot




source ~/.bashrcو در آخرdrush status</description>
                <category>محتوای طراحی وب</category>
                <author>genius.ha</author>
                <pubDate>Fri, 17 Apr 2020 14:23:19 +0430</pubDate>
            </item>
                    <item>
                <title>شروع کار با React در دروپال 8</title>
                <link>https://virgool.io/web-design/%D8%B4%D8%B1%D9%88%D8%B9-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-react-%D8%AF%D8%B1-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-8-is04omx1csqp</link>
                <description>drupalreact jsکامپایل react با استفاده از Laravel Mixnpm install react react-dom -snpm install laravel-mix cross-env --save-devساخت webpack.mix.js  به صورت زیرconst mix = require(&#039;laravel-mix&#039;);

mix.react(&#039;src/index.js&#039;, &#039;dist&#039;);ساختpackage.json  به صورت زیر&amp;quotscripts&amp;quot: {
  &amp;quotdev&amp;quot: &amp;quotnpm run development&amp;quot,
  &amp;quotdevelopment&amp;quot: &amp;quotcross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js&amp;quot,
  &amp;quotwatch&amp;quot: &amp;quotnpm run development -- --watch&amp;quot,
  &amp;quothot&amp;quot: &amp;quotcross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js&amp;quot,
  &amp;quotprod&amp;quot: &amp;quotnpm run production&amp;quot,
  &amp;quotproduction&amp;quot: &amp;quotcross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js&amp;quot
},برای دیویلوپ کردن از دستور زیر استفاده کنید$ npm run watchبرای ساخت پروژه نهایی از دستور زیر$ npm run production</description>
                <category>محتوای طراحی وب</category>
                <author>genius.ha</author>
                <pubDate>Fri, 17 Apr 2020 14:13:08 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش ماژول نویسی دروپال 8 قسمت 6</title>
                <link>https://virgool.io/web-design/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%A7%DA%98%D9%88%D9%84-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-8-%D9%82%D8%B3%D9%85%D8%AA-6-ds9gpv2md4gl</link>
                <description>drupalدر این اموزش به فرم ها در دروپال ۸ میپردازیم   در ادامه قصد داریم ماژول قبلی را گسترش داده و به فیلد های که جدید در دروپال8 اضافه شده است بپردازیمآموزش ماژول نویسی دروپال 8 قسمت 5آموزش ماژول نویسی دروپال 8 قسمت 4آموزش ماژول نویسی دروپال 8 قسمت 3آموزش ماژول نویسی دروپال 8 قسمت 2آموزش ماژول نویسی دروپال 8 قسمت 1فرم های که به دروپال 8 اضافه شده اند به صوت زیر می باشدtele-mailnumberdateurlsearchrangecolorدر ادامه میخواهیم هر یک از فیلد ها را به مازول خودمون اضافه کنیم&lt;?php
namespace Drupal\custom\form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormInterface;
use Drupal\Core\Form\FormStateInterface;

class CustomForm extends FormBase {

  /**
   * Returns a unique string identifying the form.
   *
   * The returned ID should be a unique string that can be a valid PHP function
   * name, since it&#039;s used in hook implementation names such as
   * hook_form_FORM_ID_alter().
   *
   * @return string
   *   The unique string identifying the form.
   */
  public function getFormId() {
    return &#039;my_custom_form&#039;;
  }
  /**
   * Form constructor.
   *
   * @param array $form
   *   An associative array containing the structure of the form.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The current state of the form.
   *
   * @return array
   *   The form structure.
   */
  public function buildForm(array $form, FormStateInterface $form_state) {

    $form[&#039;description&#039;] = [
      &#039;#type&#039; =&gt; &#039;item&#039;,
      &#039;#markup&#039; =&gt; $this-&gt;t(&#039;Please enter
      the title and accept the terms of use of the site.&#039;),
    ];
    $form[&#039;title&#039;] = [
      &#039;#type&#039; =&gt; &#039;textfield&#039;,
      &#039;#title&#039; =&gt; $this-&gt;t(&#039;Title&#039;),
      &#039;#description&#039; =&gt; $this-&gt;t(&#039;Enter the title of
      the book. Note that the title must be at least 10 characters in length.&#039;),
      &#039;#required&#039; =&gt; TRUE,
    ];
    $form[&#039;phone&#039;] = array(
      &#039;#type&#039; =&gt; &#039;tel&#039;,
      &#039;#title&#039; =&gt; t(&#039;Your telephone number&#039;),
      &#039;#placeholder&#039; =&gt; &#039;+0 (000) 000-0000&#039;,
    );
    $form[&#039;email&#039;] = array(
      &#039;#type&#039; =&gt; &#039;email&#039;,
      &#039;#title&#039; =&gt; t(&#039;Your e-mail address&#039;),
      &#039;#placeholder&#039; =&gt; &#039;john @example.com&#039;,
    );
    $form[&#039;stepped_float&#039;] = array(
      &#039;#type&#039; =&gt; &#039;number&#039;,
      &#039;#title&#039; =&gt; t(&#039;This will allow the
       floating point numbers 2, 2.5, 3 and 3.5&#039;),
      &#039;#min&#039; =&gt; 2,
      &#039;#step&#039; =&gt; 0.5,
      &#039;#max&#039; =&gt; 3.5,
    );
    $form[&#039;integer&#039;] = array(
      &#039;#type&#039; =&gt; &#039;number&#039;,
      &#039;#title&#039; =&gt; t(&#039;This will allow only
      integers greater or equal to 41&#039;),
      &#039;#min&#039; =&gt; 41,
    );
    $form[&#039;float&#039;] = array(
      &#039;#type&#039; =&gt; &#039;number&#039;,
      &#039;#title&#039; =&gt; t(&#039;This will allow any
      floating point number smaller or equal to 100&#039;),
      &#039;#max&#039; =&gt; 100,
      &#039;#step&#039; =&gt; &#039;any&#039;,
    );
    $form[&#039;stepped_float&#039;] = array(
      &#039;#type&#039; =&gt; &#039;number&#039;,
      &#039;#title&#039; =&gt; t(&#039;This will allow the
      floating point numbers 2, 2.5, 3 and 3.5&#039;),
      &#039;#min&#039; =&gt; 2,
      &#039;#step&#039; =&gt; 0.5,
      &#039;#max&#039; =&gt; 3.5,
    );
    $form[&#039;background_color&#039;] = array(
      &#039;#type&#039; =&gt; &#039;color&#039;,
      &#039;#title&#039; =&gt; t(&#039;Pick a background color&#039;),
    );
    $form[&#039;date&#039;] = array(
      &#039;#type&#039; =&gt; &#039;date&#039;,
      &#039;#title&#039; =&gt; t(&#039;date&#039;),
      &#039;#date_data_format&#039; =&gt; &#039;Y-m-d&#039;,
    );
    $form[&#039;keyword&#039;] = array(
      &#039;#type&#039; =&gt; &#039;search&#039;,
      &#039;#title&#039; =&gt; t(&#039;Search&#039;),
      &#039;#placeholder&#039; =&gt; t(&#039;Enter a term to look up&#039;),
    );
    $form[&#039;accept&#039;] = array(
      &#039;#type&#039; =&gt; &#039;checkbox&#039;,
      &#039;#title&#039; =&gt; $this
        -&gt;t(&#039;I accept the terms of use of the site&#039;),
      &#039;#description&#039; =&gt; $this-&gt;t(&#039;Please read and accept the terms of use&#039;),
    );
    $form[&#039;actions&#039;] = [
      &#039;#type&#039; =&gt; &#039;actions&#039;,
    ];
    $form[&#039;actions&#039;][&#039;submit&#039;] = [
      &#039;#type&#039; =&gt; &#039;submit&#039;,
      &#039;#value&#039; =&gt; $this-&gt;t(&#039;Submit&#039;),
    ];

    return $form;

  }
  public function validateForm(array &amp;$form, FormStateInterface $form_state) {
    parent::validateForm($form, $form_state);

    $title = $form_state-&gt;getValue(&#039;title&#039;);
    $accept = $form_state-&gt;getValue(&#039;accept&#039;);

    if (strlen($title) &lt; 10) {
      // Set an error for the form element with a key of &amp;quottitle&amp;quot.
      $form_state-&gt;setErrorByName(
        &#039;title&#039;, $this-&gt;t(
          &#039;The title must be at least 10 characters long.&#039;));
    }

    if (empty($accept)){
      // Set an error for the form element with a key of &amp;quotaccept&amp;quot.
      $form_state-&gt;setErrorByName(
        &#039;accept&#039;, $this-&gt;t(
          &#039;You must accept the terms of use to continue&#039;));
    }

  }
  public function submitForm(array &amp;$form, FormStateInterface $form_state) {
    drupal_set_message($form_state-&gt;getValue(&#039;title&#039;));
    return;
  }
}آموزش ماژول نویسی دروپال 8فرم ها در دروپال 8فرم ها در drupal8</description>
                <category>محتوای طراحی وب</category>
                <author>genius.ha</author>
                <pubDate>Mon, 13 Apr 2020 10:12:11 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش ماژول نویسی دروپال 8 قسمت 5</title>
                <link>https://virgool.io/web-design/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%A7%DA%98%D9%88%D9%84-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-8-%D9%82%D8%B3%D9%85%D8%AA-5-kxjcjcausrob</link>
                <description>در این اموزش به فرم ها در دروپال ۸ میپردازیمآموزش ماژول نویسی دروپال 8 قسمت 4آموزش ماژول نویسی دروپال 8 قسمت 3آموزش ماژول نویسی دروپال 8 قسمت 2آموزش ماژول نویسی دروپال 8 قسمت 1فرم ها در دروپال 8ما در این مرحله ماژولی را که نوشه بودیم گسترش میدهیمابتدا در روت اصلی ماژول یه پوشه جدید به اسم Form  ایجاد میکنیم و در پوشه ایجاد شده فایل به نام CustomForm.php ایجاد میکنیم و در فایل ایجاد شده کد ها را به صورت زیر مینویسیم&lt;?&lt;?php
namespace Drupal\custom\form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormInterface;
use Drupal\Core\Form\FormStateInterface;

class CustomForm extends FormBase {
}در اینجا بک namespace برای فرم خودمون تعریف میکنمو مقادیر FormInterface و FormStateInterface برای این شاخه use  میکنیمدر ادامه باید برای این فرم یک form id ایجاد کینم/**
   * Returns a unique string identifying the form.
   *
   * The returned ID should be a unique string that can be a valid PHP function
   * name, since it&#039;s used in hook implementation names such as
   * hook_form_FORM_ID_alter().
   *
   * @return string
   *   The unique string identifying the form.
   */
  public function getFormId() {
    return &#039;my_custom_form&#039;;
  }بعد میتوانیم فیلد های خودمون رابه صورت زیر ایجاد کینم/**
   * Form constructor.
   *
   * @param array $form
   *   An associative array containing the structure of the form.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The current state of the form.
   *
   * @return array
   *   The form structure.
   */
  public function buildForm(array $form, FormStateInterface $form_state) {

    $form[&#039;description&#039;] = [
      &#039;#type&#039; =&gt; &#039;item&#039;,
      &#039;#markup&#039; =&gt; $this-&gt;t(&#039;Please enter the title and accept the terms of use of the site.&#039;),
    ];
    $form[&#039;title&#039;] = [
      &#039;#type&#039; =&gt; &#039;textfield&#039;,
      &#039;#title&#039; =&gt; $this-&gt;t(&#039;Title&#039;),
      &#039;#description&#039; =&gt; $this-&gt;t(&#039;Enter the title of the book. Note that the title must be at least 10 characters in length.&#039;),
      &#039;#required&#039; =&gt; TRUE,
    ];

    $form[&#039;accept&#039;] = array(
      &#039;#type&#039; =&gt; &#039;checkbox&#039;,
      &#039;#title&#039; =&gt; $this
        -&gt;t(&#039;I accept the terms of use of the site&#039;),
      &#039;#description&#039; =&gt; $this-&gt;t(&#039;Please read and accept the terms of use&#039;),
    );
    $form[&#039;actions&#039;] = [
      &#039;#type&#039; =&gt; &#039;actions&#039;,
    ];
    $form[&#039;actions&#039;][&#039;submit&#039;] = [
      &#039;#type&#039; =&gt; &#039;submit&#039;,
      &#039;#value&#039; =&gt; $this-&gt;t(&#039;Submit&#039;),
    ];

    return $form;

  }برای فرم میتوانیم یک ولیدت ایجاد کنیمpublic function validateForm(array &amp;$form, FormStateInterface $form_state) {
    parent::validateForm($form, $form_state);

    $title = $form_state-&gt;getValue(&#039;title&#039;);
    $accept = $form_state-&gt;getValue(&#039;accept&#039;);

    if (strlen($title) &lt; 10) {
      // Set an error for the form element with a key of &amp;quottitle&amp;quot.
      $form_state-&gt;setErrorByName(&#039;title&#039;, $this-&gt;t(&#039;The title must be at least 10 characters long.&#039;));
    }

    if (empty($accept)){
      // Set an error for the form element with a key of &amp;quotaccept&amp;quot.
      $form_state-&gt;setErrorByName(&#039;accept&#039;, $this-&gt;t(&#039;You must accept the terms of use to continue&#039;));
    }

  }و در انتها مقدار submit را تعریف میکنمpublic function submitForm(array &amp;$form, FormStateInterface $form_state) {
    drupal_set_message($form_state-&gt;getValue(&#039;title&#039;));
    return;
  }در نهایت ماژول به صورت زیر خواهد بود&lt;?php
namespace Drupal\custom\form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormInterface;
use Drupal\Core\Form\FormStateInterface;

class CustomForm extends FormBase {

  /**
   * Returns a unique string identifying the form.
   *
   * The returned ID should be a unique string that can be a valid PHP function
   * name, since it&#039;s used in hook implementation names such as
   * hook_form_FORM_ID_alter().
   *
   * @return string
   *   The unique string identifying the form.
   */
  public function getFormId() {
    return &#039;my_custom_form&#039;;
  }
  /**
   * Form constructor.
   *
   * @param array $form
   *   An associative array containing the structure of the form.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The current state of the form.
   *
   * @return array
   *   The form structure.
   */
  public function buildForm(array $form, FormStateInterface $form_state) {

    $form[&#039;description&#039;] = [
      &#039;#type&#039; =&gt; &#039;item&#039;,
      &#039;#markup&#039; =&gt; $this-&gt;t(&#039;Please enter the title and accept the terms of use of the site.&#039;),
    ];
    $form[&#039;title&#039;] = [
      &#039;#type&#039; =&gt; &#039;textfield&#039;,
      &#039;#title&#039; =&gt; $this-&gt;t(&#039;Title&#039;),
      &#039;#description&#039; =&gt; $this-&gt;t(&#039;Enter the title of the book. Note that the title must be at least 10 characters in length.&#039;),
      &#039;#required&#039; =&gt; TRUE,
    ];

    $form[&#039;accept&#039;] = array(
      &#039;#type&#039; =&gt; &#039;checkbox&#039;,
      &#039;#title&#039; =&gt; $this
        -&gt;t(&#039;I accept the terms of use of the site&#039;),
      &#039;#description&#039; =&gt; $this-&gt;t(&#039;Please read and accept the terms of use&#039;),
    );
    $form[&#039;actions&#039;] = [
      &#039;#type&#039; =&gt; &#039;actions&#039;,
    ];
    $form[&#039;actions&#039;][&#039;submit&#039;] = [
      &#039;#type&#039; =&gt; &#039;submit&#039;,
      &#039;#value&#039; =&gt; $this-&gt;t(&#039;Submit&#039;),
    ];

    return $form;

  }
  public function validateForm(array &amp;$form, FormStateInterface $form_state) {
    parent::validateForm($form, $form_state);

    $title = $form_state-&gt;getValue(&#039;title&#039;);
    $accept = $form_state-&gt;getValue(&#039;accept&#039;);

    if (strlen($title) &lt; 10) {
      // Set an error for the form element with a key of &amp;quottitle&amp;quot.
      $form_state-&gt;setErrorByName(&#039;title&#039;, $this-&gt;t(&#039;The title must be at least 10 characters long.&#039;));
    }

    if (empty($accept)){
      // Set an error for the form element with a key of &amp;quotaccept&amp;quot.
      $form_state-&gt;setErrorByName(&#039;accept&#039;, $this-&gt;t(&#039;You must accept the terms of use to continue&#039;));
    }

  }
  public function submitForm(array &amp;$form, FormStateInterface $form_state) {
    drupal_set_message($form_state-&gt;getValue(&#039;title&#039;));
    return;
  }
}میتوانیم یک route جدید برای فرم تعرف کنیم \mycustom.content:
  path: &#039;/hello&#039;
  defaults:
    _controller: &#039;Drupal\mycustom\Controller\MycustomController::content&#039;
    _title: &#039;Hello world&#039;
  requirements:
    _permission: &#039;my custom permisstion&#039;
mycustom.form:
  path: &#039;/csfrom&#039;
  defaults:
    _form: &#039;Drupal\mycustom\Form\MycustomForm&#039;
    _title: &#039;Hello world&#039;
  requirements:
    _permission: &#039;my custom permisstion&#039;آموزش ماژول نویسی دروپال 8فرم ها در دروپال 8</description>
                <category>محتوای طراحی وب</category>
                <author>genius.ha</author>
                <pubDate>Mon, 13 Apr 2020 10:11:12 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش ماژول نویسی دروپال 8 قسمت 4</title>
                <link>https://virgool.io/web-design/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%A7%DA%98%D9%88%D9%84-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-8-%D9%82%D8%B3%D9%85%D8%AA-4-ydy2lasaiiyu</link>
                <description>drupalدر این آموزش قصد دارم ایجاد permission  در دروپال توضیح بدم یعنی شما بتونید برای صفحه ای که ایجاد کرده اید این امکان رو داشته باشید که کاربر خاصی به محتوای صفحه دسترسی داشته باشدآموزش ماژول نویسی دروپال 8 قسمت 3آموزش ماژول نویسی دروپال 8 قسمت 2آموزش ماژول نویسی دروپال 8 قسمت 1برای این مورد در شاخه ماژول یک فایل به اسم custom.permissions.yml ایجاد میکنیم و کد ها را به صورت زیر اضافه خواهیم کرد# In custom.permissions.yml file.
access all views:
  title: &#039;my custom permisstion&#039;
  description: &#039;A custom permission for your module settings page.&#039;
  restrict access: TRUEو در فایل custom.routing در قسمت requirements کد را به صورت زیر ویرایش میکنمrequirements:
    _permission: &#039;my custom permisstion&#039;بعد با پاک کردن کش و رفتن به صفحه مدیریت پرمیشن ها میتوانید به یک نقش خاص اجازه دسترسی به صفحه خودتون را دهیدآموزش ماژول نویسی دروپال 8</description>
                <category>محتوای طراحی وب</category>
                <author>genius.ha</author>
                <pubDate>Mon, 13 Apr 2020 10:10:07 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش ماژول نویسی دروپال 8 قسمت 3</title>
                <link>https://virgool.io/web-design/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%A7%DA%98%D9%88%D9%84-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-8-%D9%82%D8%B3%D9%85%D8%AA-3-terc6xas0f1x</link>
                <description>drupalدر این قسمت از آموزش قصد داریم یک Controller  ایجاد کنیم و نتیجه کار را به صوت فیزیکی ببینیمدر قسمت ها قبلآموزش ماژول نویسی دروپال 8 قسمت 2آموزش ماژول نویسی دروپال 8 قسمت 1نحوه آموزش ساخت یک ماژول و ایجاد Routing در دروپال را یاد گرفیتم در این آموزش قصد داریم یک Controller ایجاد کنیمایجاد Controller  در drupal8 :ابتدا در شاخه ماژول یک پوشه به نام src ایجاد میکنم و در پوشه ایجاد شده پوشه دیگری به نام Controller ایجاد میکنم و یک فایل به نام CustomController.php میسازیم و کد ها را به صورت زیر مینویسیم&lt;?php
/**
 * @file
 * Contains \Drupal\custom\Controller\CustomController.
 */
namespace Drupal\custom\Controller;

use Drupal\Core\Controller\ControllerBase;

class CustomController extends ControllerBase {
  public function content() {
    return array(
      &#039;#type&#039; =&gt; &#039;markup&#039;,
      &#039;#markup&#039; =&gt; t(&#039;Hello world&#039;),
    );
  }
}در کد بالا هر کلاس تعریف شده در دروپال 8 باید در یک فضای کاری یا به اصطلاح namespace قرار گیرد. این کار از این جهت لازم است که در صورت وجود کلاس ها با نام مشابه در زمان ارجاع به کلاس از بیرون تداخلی صورت نگیرد و هر کلاس با توجه به فضای کاری خود مورد ارجاع قرار گیرد. بنابراین این پارامتر را نیز اضافه کنید.حالا با یک بار پاک کردن کش دروپال و رفتن به صفحه /hello میتوانید نتیجه کار خودتون را ببینید \آموزش ماژول نویسی دروپال 8</description>
                <category>محتوای طراحی وب</category>
                <author>genius.ha</author>
                <pubDate>Mon, 13 Apr 2020 10:09:15 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش ماژول نویسی دروپال 8 قسمت 2</title>
                <link>https://virgool.io/web-design/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%A7%DA%98%D9%88%D9%84-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-8-%D9%82%D8%B3%D9%85%D8%AA-2-ktu4dctnqdeg</link>
                <description>drupalدر این جلسه قصد داریم ماژول خودمون را گسترش دهیم ولی پیش از این کمی در مورد معماری mvc صحبت خواهیم کرد و بعد به routing  در دروپال خواهیم پرداختمعماری mvc از یک رویکرد سه لایه تبعیت می کند. هر بخش از معماری mvc دارای ویژگی های خاصی بوده و وظایف ویژه ای را به صورت مجزا بر عهده دارد.معماری mvc بارها به گوشتان خورده است و شاید از خود سوال کنید که این معماری به چه دردی می خورد و علت محبوبیت Mvc چیست. آشنایی و شناسایی دقیق با معماری Mvc سبب می شود که نتیجه کارتان یک تغییر اساسی نمایددر این معماری در واقع ما دارای ترجمه ای از قسمت های مهم معماری به شکل زیر هستیم:MODEL : وظیفه کار با پایگاه داده را بر عهده دارد.VIEW : وظیفه ارتباط با کاربر نهایی را بر عهده دارد.Control : وظیفه کنترل View و Model و نحوه ارتباط آن دو را با هم بر عهده داردMVC چیست ؟MvC مخفف سه کلمه Model View Controller هست . در واقع MVC بر روی معماری های چند لایه ای جهت جداسازی قسمت های مختلف برنامه و به طور دقیق تر جدا کردن بخش ها منطقی برنامه اعم از دیتا ، permission ها ، چک کردن صحت داده ها و .... از لایه Presentation layer یا در واقع همان لایه ای که مستقیما با کاربر نهایی (End user) در ارتباط است ،قرار میگیرد. پس بر اساس توضیحات فوق می توانیم هر یک از بخش های معماری MVC یعنی Model و View و controller را به شکل زیر تعریف کنیم.1. Modelدر واقع بار اصلی معماری MVC بر عهده این بخش است . این بخش می تواند با داده ها در ارتباط باشد .الزاماً منظور از داده حتما ارتباط با پایگاه های داده همچون MSSQL و Access و ... نیست ، حتی منبع داده ها در بخش Model می تواند یک آرایه از اعداد و یا هر چیز دیگری باشد . همچنین Model وظیفه چک کردن داده ها جهت صحت درستی داده ها را هم بر عهده دارد (در این زمینه همکاری بیشتری با بخش Controller دارد) و همینطور وظایف دیگری که در مثال ها ی عملی که در آینده خواهم زد بیشتر آشنا خواهید شد.2. Viewاین بخش که در واقع همان بخش Presentation Layer در معماری 3 لایه میباشد وظیفه بر قراری ارتباط با کاربر نهایی و گرفتن داده از کاربر و نمایش داده های اماده با کاربراز طریق برقراری ارتباط با دو بخش دیگر یعنی Model و controller است . در واقع نکته مهمی که در بخش View باید مد نظر داشت این است که این لایه مسئول کنترل صحت داده های وارد شده از طریق کاربر و همچنین مسئول صحت داده های نشان داده شده به کاربر نیست . در واقع این بخش با داده های خام کار میکند . یک مثال ساده خیلی از برنامه نویسان هنگامی که در فرم Login برنامه ،کاربر کلمه عبور خود را وارد میکند ، در همان فرم Login اقدام به چک کردن پسورد مبنی بر صحت آن و ... می کنند . که این عمل در معماری MVC قابل قبول نیست . در واقع برای حل مسئله فوق در معماری MVC در فرم Login هنگامی که کاربر کلمه عبور را وارد کرد و دکمه Login یا ورود را زد ، کلمه عبور داده شده بدون هیچ گونه اعمالی اعم از Encrypt کردن و ... به بخش های دیگر فرستاده میشود و فقط یک نتیجه ساده مبنی بر این که کاربر اجازه ورود دارد یا خیر را از بخش های دیگر دریافت میکند که بر اساس آن اجازه ورود کاربر به برنامه داده میشود .3. Controllerاین بخش همانطور که از اسم آن مشخص است یک بخش کنترل کننده می باشد ، و در واقع واسطی بین دو بخش Model و View میباشد. حال ببینیم روند اجرای برنامه در معماری MVC به چه نحوی خواهد بود . در معماری MVC روند کلی برنامه (جزئیات را در ادامه خواهید دید) به این شکل است که کاربر تقاضای خود را از طریق واسط های برنامه نویسی (نظیر Form ها و User Control ها و .. ) از برنامه (از بخش View)درخواست می کند . بخش View در خواست ها را به بخش Controller فرستاده و این بخش با برقراری ارتباط با بخش Model در خواست های کاربر را پردازش کرده و پس از پایان پردازش زمانی که خروجی درخواست داده شده آماده گردید بخش Controller بخش View را آگاه می سازد تا خود را بر اسا س تغییرات جدید که اصطلاحاً در معماری MVC به آن حال Model می گویند ، به روز سازد . در واقع چیزی که باعث میشود تا بخش Controller به بخش View اطلاع دهد که باید حالت جدید model را دریافت کند و خود را Update کند این است که بخش View باید قبلا خودش را در بخش Model اصطلاحا Register کرده باشد که البته عمل Register کردن توسط بخش Controller انجام میگیرد . نحوه register کردن بخش View به معماری آن محیط و همچنین زبانی که توسط آن برنامه را گسترش میدهید و همچنین قابلیت های آن زبان بستگی دارد.Routing  در دروپال :routing تعیین کننده مسیری هستند که باید د رآن مسیر کد خاصی اجرا شود این کار با استفاده از یک درخواست به url انجام میشود به عنوان مثال ما میخواهیم یک یک  آدرس/hello ایجاد کنیم و عبارت Hello world را داشته باشیمابتدا در مسر ماژول ایجاد شده یک فایل به اسم custom.routing.yml ایجاد میکنیم و کد ها را به صورت زیر مینویسیمcustom.content:
  path: &#039;/hello&#039;
  defaults:
    _controller: &#039;Drupal\custom\Controller\CustomController::content&#039;
    _title: &#039;Hello world&#039;
  requirements:
    _permission: &#039;access content&#039;در قسمت path  مسیر را تعیین میکنمدر قسمت  defaults تعیین میکنیم که این مسیر چه ریسپانسی داشته باشد یعنی باید یک کنترلر ایجاد کنیم به اسم CustomController که مقداری که تعریف میکنم را برمیگرداند .\در آموزش بعد یک کنترلر تعریف میکنم و ماژول خودمان را گشترش میدهیمآموزش ماژول نویسی دروپال 8</description>
                <category>محتوای طراحی وب</category>
                <author>genius.ha</author>
                <pubDate>Mon, 13 Apr 2020 10:06:22 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش ماژول نویسی دروپال 8 قسمت 1</title>
                <link>https://virgool.io/web-design/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%A7%DA%98%D9%88%D9%84-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-8-%D9%82%D8%B3%D9%85%D8%AA-1-cdxyojb5ryak</link>
                <description>drupalدر ابتدا میخواهیم  یک ماژول برای دروپال ۸ ایجاد کنیم همچنین میخواهیم یک پیج ایجاد کنیم و دسترسی های مربوط به پیج را اضافه کنیم و در آخر پیکربندی های مربوط به نصب ماژول برای دروپال ۸ را انجام دهیم .برای ایجاد یک ماژول جدید در دروپال در پوشه module رفته و یک پوشه به نام دلخواه ایجاد میکنیمدر پوشه ایجاد شده باید فایل .info.yml را ایجاد کردهمن نام ماژول خودم رو custom گذاشتم و فایل به صورت زیر ایجاد کیکنمcustom.info.ymlو فایل به صورت زیر مینویسیمname: custom
type: module
description : &#039;test module  drupal 8&#039;
core: 8.xشما میتوانید پیشنازهای برای این ماژول داشته باشید که به صورت زیر میتوانید آن ها را در ماژول خود بیان کنید \name: custom
type: module
description : &#039;test module  drupal 8&#039;
core: 8.x
dependencies:
  - drupal:breakpoint
  - drupal:imageدر آموزش بعدی ایجاد یک پیج سفارشی را آموزش خواهیم دادآموزش ماژول نویسی دروپال 8</description>
                <category>محتوای طراحی وب</category>
                <author>genius.ha</author>
                <pubDate>Sun, 05 Apr 2020 19:55:17 +0430</pubDate>
            </item>
                    <item>
                <title>نصب برنامه xampp روی لینوکس</title>
                <link>https://virgool.io/web-design/%D9%86%D8%B5%D8%A8-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-xampp-%D8%B1%D9%88%DB%8C-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-k3fuiq7k3zrk</link>
                <description>خیلی وقت بود میخواستم یک مقاله بنویسم ولی موضوع خوبی به ذهنم نمی رسید تا این که چند وقت پیش سر نصب xampp روی لینوکس به مشکل خوردم و گفتم کار های لازم رو بنویسم شاید مشکل یک تازه کار مثل خودم رو بتونم حل کنم.البته نصب برنامه xampp مشکل خاصی نداره و با چنتا دستور و چنتا next زدن (مثل ویندوز) به راحتی قابل نصبه ولی خب تازه کار بودن باعث میشه که کارو برای خودمون سخت بکنیم و به مشکلاتی بخوریم که حتی بخوایم از راهی که میریم عقب بکشیم (برگشتن به ویندوز)قبل از این که بریم سراغ نصب باید بگم که من لینوکس manjaro دارم که arch بیس هستش البته فکر نکنم کار های که میگم روی توزیع های debian بیس فرقی داشته باشه.خب بریم سر وقت نصب برنامه. اول از همه برنامه xampp رو از سایت www.apachefriends.org دانلود کنید بعد ترمینال رو باز کنید و 3 دستور زیر رو وارد کنید (با فرض اینکه فایل نصبی توی پوشه پیش فرض دانلود شما قرار داره).cd ~/Downloadschmod +x xampp.runsudo ./xampp.runتوجه کنید که توی دو دستور بالا باید نام کامل فایل رو بنویسید.بعد از وارد کردن دستورات بالا فایل برای شما باز میشه و با زدن next های متوالی نصب میشه براتون.توی مرحله بعد باید php موجود توی xampp رو به بشناسونید تا ازین به بعد php داخل xampp رو به عنوان php پیشفرض سیستم استفاده کنه با دستور زیر به راحتی انجام میشه این کار براتون البته اگر composer یا php رو از قبل با استفاده از مخازن نصب کردید حتما پاک کنید.sudo ln -s /opt/lampp/bin/php /usr/bin/phpخب الان اگر دستور php --ini رو بزنید میبینید که php سیستم از xampp لود شده.توی مرحله بعد و مرحله آخر میریم برای نصب composer که باید حتما روی php که روی xampp هستش نصب بشه برای همین توی مرحله قبل گفتم اگر از مخازن لینوکس composer و php رو نصب کردید حتما پاک کنید که مشکل و تداخلی پیش نیاد براتون خب با وارد کردن به ترتیب دستورات زیر composer برای شما نصب میشه.sudo curl -s https://getcomposer.org/installer | /opt/lampp/bin/phpsudo mv composer.phar /usr/local/bin/composersudo ln -s /opt/lampp/bin/php /usr/local/bin/phpخب الان همه چی آمادست و میتونید با دستورات زیر از xampp استفاده کنید.sudo /opt/lampp/lampp startبرای راه اندازی xampp sudo /opt/lampp/lampp stopبرای غیر فعال کردن xamppsudo /opt/lampp/lampp restartبرای راه اندازی مجدد xampp وقتی که فعال هستش.امید وارم تونسته باشم بهتون کمکی بکنم:)</description>
                <category>محتوای طراحی وب</category>
                <author>خشایار قندهاری</author>
                <pubDate>Thu, 26 Sep 2019 23:28:06 +0330</pubDate>
            </item>
                    <item>
                <title>چرا دروپال (بخش چهارم)</title>
                <link>https://virgool.io/web-design/httpsvirgoolioorgkiani%DA%86%D8%B1%D8%A7-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-%D8%A8%D8%AE%D8%B4-%DA%86%D9%87%D8%A7%D8%B1%D9%85-m5zn6dkgumjg</link>
                <description>دروپال برای تولید قالب آنچنان هم، دسته و پا بسته نیست. فایلی به نام template.php ،وجود داره که بسیاری از هوک‌ها سیستم و ماژول‌ها، داخلش قابل دسترس هستند. تصور کنید اگر ماژولی فرمی رو ایجاد کرد و اگر دروپال در زمان فراخوانی هوک‌ها (ابتدا ماژول‌ها به ترتیب حروف الفبا مرتب‌سازی می‌شوند) هوک form_alter شما رو زود تر از ماژول مورد نظر فراخوانی کرد، در فایل template.php می‌تونید form_alter تون رو بنویسید چون دروپال بعد از فراخوانی ماژول‌ها، قالب رو و به طبع (termplate.php) رو صدا می‌زنه.نکته‌ی مهمتری که در ایجاد قالب حائز اهمین هست، امکان جدا سازی جزء به جزء یک قالب بر اساس نام ماشینی مولفه یا آدرس صفحه می‌باشد. به عنوان مثال فایل قالب طرح بندی صفحه تماس با ما :html--contact.tpl.phpو یا فایل قالب بلوک برای بلوک آب و هوا:block--weather.tpl.phpو یا همچنین فایل قالب صفحه‌ی اصلی:page--front.tpl.phpساختار قالب در دروپالهمینطور که در شکل بالا مشاهده می‌کنید، دروپال قالب رو به بخش‌های متعددی تقسیم می‌کنه و تا بشه هر بخش رو به شکل مجزا ویرایش کرد.دروپال تا قبل از نسخه‌ی ۸ از php template به عنوان موتور قالب استفاده می‌کرد و در دروپال ۸ از موتور قالب twigهمچنین در دروپال این امکان وجود داره تا بتوان از یک قالب، یک زیر قالب تولید کرد. زیر قالب تولید شده از تمام کانفیگ‌های قالب پدر بهره می‌بره مگر کانفیگی Override بشه. بنا بر همین خاصیت، قالب‌های بسیار خوبی توسعه داده شده مثل قالب Omega که برای تولید وب‌سایت‌های Responsive به کار میره.در حال حاضر به تعداد ۲،۷۸۱ عدد قالب در وب‌سایت دروپال قابل بارگیری و توسعه موجود هست.</description>
                <category>محتوای طراحی وب</category>
                <author>Hossein Kiani</author>
                <pubDate>Mon, 01 Jul 2019 21:31:34 +0430</pubDate>
            </item>
                    <item>
                <title>چرا دروپال (بخش سوم)</title>
                <link>https://virgool.io/web-design/%DA%86%D8%B1%D8%A7-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-%D8%A8%D8%AE%D8%B4-%D8%B3%D9%88%D9%85-y9xi1vgcmnhu</link>
                <description>ادغام‌پذیری دروپالدر آخر بخش دوم از ادغام پذیری دروپال صحبت شد. مقرر شد تا در این قسمت مثال‌هایی در مورد ادغام‌پذیری دروپال صحبت کنم. مهمترین‌ ان‌ها عبارت‌اند از:RedmineJiraAlfrescoCPanelDirectAdminISPConfigMagentoPrestashop (Sandbox)SharepointSugarCRMVtiger CRMGitlabGithubAmazon S3SalesforceGoogle Servicesetc ...دروپال از هسته‌ای پیشرفته برخورداره. از توانایی‌های هسته دروپال میشهبه  رویداد گرایی اشاره کرد. این خاصیت کمک می‌کنه تا ماژول‌ها بتونند مکمل دیگری باشند. باز این از امتیازاتی هست که در کم‌تر در نرم‌افزاری اون‌هم به میزان کم به‌کار رفته. به عنوان مثال ماژول بسیار قدرتمندی به‌نام Views برای دروپال ایجاد شده که یک سیستم تولید نمایش (view) هست و یک گزارش‌ساز در درون آن گنجانده شده. حال برای این ماژول بیش از ۵،۶۰۰ ماژول جانبی (برای نسخه‌های مختلف دروپال تولید) شده. بسیاری از نیاز‌های یک نرم‌افزار، وب‌سایت یا فروشگاه را می‌توان با نصب و پیکربندی ماژولهای پایه‌ای تولید نمود. به شکلی که برای یک نیاز خاص، الزامی به نصب ماژول مازاد نیست. به عنوان مثال، Slideshow widget را می‌توان با استفاده از فرم‌ساز دروپال (Content)، بخش ورود اطلاعات را ایجاد، با Views خروجی اسلایدشو به صورت بلاک (Widget) تولید نمود. ماژول Views از تعداد زیادی لایبرری جاوااسکریپتی اسلایدشو پشتیبانی می‌کنه. که البته به صورت جداگانه قابل نصب و استفاده هستند.باز می‌گردیم به رویدادگرایی که این امکان به شکل گسترده‌ای در دروپال توسعه داده شده. این خاصیت با استفاده از هوک‌ها قابل پیداسازی هست. به عنوان مثال، نیاز به ویرایش یک فرم داریم که توسط ماژول X تولید شده. برای این منظور هوکی به نام form_alter تعریف شده که به فرم، بعد از ایجاد شدن و قبل از رندر شدن می‌توانیم دسترسی داشته باشیم.دروپال این قابلیت را دارد تا ماژول‌ها هم هوک‌های خودشون رو تولید کنند. به عنوان مثال، Views هوک‌هایی دارد که می‌توان به یک view را از زمان Initialize تا زمان رندر شدن در زمان‌ها مختلف دسترسی پیدا کرده و تغییر داد. ۱. قبل از ایجاد کوئری دیتابیس، ۲. قبل از اجرای کوئری، ۳. قبل از اجرا و ۴. قبل از رندر شدن نمایش آن. برای مشاده‌ی هوک‌های Views به این آدرس بروید و برای آشنایی بیشتر با هوک در دروپال به اینجا مراجعه کنید.</description>
                <category>محتوای طراحی وب</category>
                <author>Hossein Kiani</author>
                <pubDate>Thu, 06 Dec 2018 21:27:15 +0330</pubDate>
            </item>
                    <item>
                <title>چرا دروپال (بخش دوم)</title>
                <link>https://virgool.io/web-design/%DA%86%D8%B1%D8%A7-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85-o0ez74r8ocpv</link>
                <description>چرا دروپال (بخش دوم)دروپال فراتر یک سیستم مدیریت محتوا بوده!در وب‌سایت دروپال بخشی هست به‌نام Distributions، که نرم‌افزار‌هایی که باهاش تولید شده در این قسمت قابل دسترس هست. تا این ساعت ۱،۲۶۴ تا توزیع مختلف از دروپال روی این بخش قرار گرفته. انواع نرم‌افزارها رو می‌تونید بارگذاری کنید و لذتش رو ببرید. نرم‌افزار‌هایی اعم از:ERPCRMProject ManagementCODGovernment PortalLMSCommerceetc.کمتر نرم‌افزاری رو دیدم که این‌همه توسعه پذیر باشه. تا الان بالای ۴۲ هزار ماژول برای انواع نسخه‌های دروپال توسعه داده شده و همگی تحت مجوز GPL 2 در دسترس هستند. بالای ۱۱۳ هزار توسعه دهنده و بالای ۱،۳۰۰ Commit در هفته‌ی گذشته. دروپال پس خیلی هم محبوبیتش کم نیست.آماری رو چند سال پیش وب‌سایت Acquia ارائه داد که نمایان‌گر میزان استفاده از نرم‌افزار‌های به‌کار برده در پورتال‌های دولتی آمریکا بود:مقایسه‌ی آمار استفاده از دروپال و سایر CMS ها در پورتال‌های دولتی آمریکااز انجا که دروپال بیشتر برای مصارف خاص مورد استفاده قرار می‌گیرد ماژول‌های متعددی برای ادغام‌پذیری با نرم‌افزارهای دیگر , سرویس‌های معروف به وفور تولید شده است. در بخش بعدی مطالب تکمیلی و همچنین مثال‌هایی در این زمینه‌ی درج خواهد شد.</description>
                <category>محتوای طراحی وب</category>
                <author>Hossein Kiani</author>
                <pubDate>Wed, 05 Dec 2018 14:37:53 +0330</pubDate>
            </item>
                    <item>
                <title>چرا دروپال (بخش یک)</title>
                <link>https://virgool.io/web-design/%DA%86%D8%B1%D8%A7-%D8%AF%D8%B1%D9%88%D9%BE%D8%A7%D9%84-%D8%A8%D8%AE%D8%B4-%DB%8C%DA%A9-yoqfrtupr00d</link>
                <description>دروپال یک نرم‌افزار تولید محتوا بر بستر وب، ابداع شده در تاریخ ۱۸ می ۲۰۰۰. یک نرم‌افزار نسبتا پیچیده، که هواداران خیلی کمتری نسبت به دوستش (وردپرس) داره. به تصویر زیر توجه کنید:مقایسه تعداد جستجو‌های انجام شده در گوگل برای نرم‌افزارهای تولید محتوااین وضعیت بغرنج‌تر خواهد شد وقتی متن فارسی رو بررسی می‌کنیم:مقایسه تعداد جستجو‌های انجام شده در گوگل برای نرم‌افزارهای تولید محتواچیزی که برخی برنامه‌نویسان از دروپال به کثرت ایراد می‌گرفتند عدم بهره‌گیری از شئ‌گرایی تا نسخه‌ی ۷ بود. چه شود استفاده از معماری نه چندان جدیدی چون MVC. کافیه یک‌بار دروپال نصب کرده باشید تا به منو‌های و اسامی پیچیده‌اش برخورد کرده باشید. دروپال تا قبل از نسخه‌ی ۸ در حالت پیش‌فرض از WYSIWYG ساپورت نمی‌کرد. برای بهبود سرعت هم سیستم کشینگش آزار دهنده است. برای تولید هر هوکی باید همه چیز از نوع کش بشه. در مورد قالب هم که اصلا صحبتی نمی‌کنم که به مثابه مقایسه‌ی سر کوجک در مقابل سر جرد لتو (وردس‌پرس) می‌مونه. کافیه یک‌بار ماژولی نصب کنید تا پیدا کردن جایی که میشه بهش دسترسی پیدا کرد از امتحان الكترومغناطيس رشته برق هم سخت‌تر باشه. در مورد ماژول نویسی هم چیزی برای گفتن ندارم!ولی واقعا دروپال همه که گفتم بده؟ اگر اسم موارد بالا رو عیب بگذاریم تنها برای تازه کارها معنا می‌ده. در پست بعدی از اینکه چرا اینقدر دروپال خوبه خواهیم خوند.</description>
                <category>محتوای طراحی وب</category>
                <author>Hossein Kiani</author>
                <pubDate>Tue, 04 Dec 2018 21:10:32 +0330</pubDate>
            </item>
            </channel>
</rss>