کار با Composer در مجنتو

getting_started_with_composer
همه‌ی آنهایی که با مجنتو نسخه‌ی ۱ کار کرده‌اند می‌دانند که باید با پوشه‌های زیاد و تودرتو سر و کله بزنند. به طور مثال برای نصب کردن افزونه‌ی وبلاگ ساخت شرکت aheadWorks باید فایل‌های افزونه در این پوشه‌ها قرار داده شود:

  • app/code/community
  • app/code/local
  • app/design/adminhtml
  • app/design/frontend
  • app/locale/en_US
  • app/locale/fa_IR (اگر افزونه نیازمند فارسی‌سازی باشد)
  • app/etc/modules
  • js
  • lib
  • skin/adminhtml
  • skin/frontend

معمولا فروشگاه‌های ساخته شده با مجنتو به بیش از یک افزونه نیازمندند. درگاه‌های بانکی (ملت، سامان، پاسارگاد و غیره)، افزونه‌های ارسال پستی (پست پیشتاز، تیپاکس و غیره)، وبلاگ، ارسال پیامک، شهرها و استان‌های ایران، افزونه‌های آنالیز (piwik و google analytics)، ارتباط با مشتری (zopim و olark) و بسیاری دیگر. این افزونه‌ها کمک می‌کنند تا مشتریان تجربه‌ی خرید راحتی داشته باشند و مدیران بتوانند خدمات بهتری ارائه دهند.

نصب کردن یک افزونه کار راحتی است. فایل‌های مورد نیاز را در پوشه‌های لازم کپی و cache فروشگاه را خالی می‌کنید. اما تقریبا همیشه این تازه قدم اول است. برنامه‌نویس‌ها باید بتوانند افزونه‌ها را با توجه به نیازهای فروشگاه تغییر دهند، آنها را بروز کنند، فارسی‌سازی کنند، با ظاهر فروشگاه مطابقت دهند و مهم‌تر از همه، تداخل بین افزونه‌ها را (اگر وجود داشته باشد) از بین ببرند. تمام این کارها، به خصوص وقتی تعداد افزونه‌ها بیشتر از یکی باشند، می‌تواند تبدیل به کابوس شود. اینجاست که Composer می‌تواند نقش نجات‌دهنده را ایفا کند.

composer چیست؟

composer ابزاری برای مدیریت وابستگی کامپوننت‌ها در PHP است. برنامه‌ی شما نیاز به یک یا چند بسته (پکیج) یا کتابخانه دارد و composer می‌تواند این بسته‌ها و کتابخانه‌ها را برای شما نصب کند. در این نوشته قصد ندارم نحوه‌ی کارکرد composer را توضیح دهم، بلکه می‌خواهم بگویم که چطور می‌توان از composer برای نصب و مدیریت افزونه‌ها (و البته تم‌ها و ترجمه‌ها) در مجنتو استفاده کرد. برای خواندن مستندات composer به وبسایت getcomposer.com سری بزنید.

composer به چه کار مجنتو ۱ می‌آید؟

در حالت ایده‌آل، شما به composer می‌گویید چه افزونه‌هایی می‌خواهید نصب کنید و composer آنها را برای شما نصب و قابل استفاده می‌کند. در این حالت کافی است تغییرات مورد نیاز افزونه در مجنتو را تعریف کنید. مجنتو ۲ به صورت پیش‌فرض با composer کار می‌کند و تقریباً نیازی نیست کار اضافه‌ای برای نصب افزونه‌ها بکنید. اما مجنتو ۱از وجود composer خبر ندارد. برای استفاده از composer باید یک سری کارهای اضافه انجام دهید. در ادامه‌ی این نوشته یک افزونه‌ی فرضی را با استفاده از composer نصب می‌کنیم تا با مراحل کار آشنا شوید.

قدم اول: افزونه

قدم اول داشتن یک افزونه است. فرض کنید یک افزونه به نام Sariina_Test داریم. این افزونه شامل فایل‌های زیر است:

  • app/code/local/Sariina/Test/etc/config.xml
  • app/code/local/Sariina/Test/Model/Test.php
  • app/etc/modules/Sariina_Test.xml
  • app/design/frontend/layout/sariina/test/layout.xml
  • skin/frontend/css/sariina/test.css

محتویات این فایل‌ها مهم نیست چون ما نمی‌خواهیم بدانیم افزونه قرار است چه کاری انجام دهد. تنها کافی است فایل‌ها را در جای مناسب قرار دهیم تا مجنتو متوجه شود یک افزونه‌ی جدید نصب شده است.

قدم دوم: ریپازیتوری

افزونه‌ی شما باید در یک ریپازیتوری قرار داده شود. این یک اجبار است و البته به این معنی نیست که حتما باید افزونه را روی github یا bitbucket قرار دهید. می‌توانید ریپازیتوری خودتان را داشته باشید و بعد به composer بگویید که می‌خواهید افزونه‌ها را از آنجا دریافت کنید. اگر می‌خواهید از افزونه‌ای استفاده کنید که خودتان ننوشته‌اید، سری به http://packages.firegento.com/ بزنید. اکثر افزونه‌های رایگان مجنتو کانکت در آنجا قرار دارند. پس افزونه‌ی Sariina_Test را روی ریپازیتوری خودمان در آدرس فرضی زیر قرار می‌دهیم:


ssh://git@repos.sariina.com/sariina/test.git

این آدرس را بعدا به composer می‌دهیم تا بداند فایل‌ها را باید از کجا دریافت کند.

قدم سوم: فایل composer.json

یک فایل به نام composer.json باید در شاخه‌ی اصلی افزونه وجود داشته باشد. در این فایل اطلاعات این پکیج را قرار می‌دهید. مثل نام پکیج، نام تولیدکنندگان، نسخه، برچسب، مجوز و غیره. برای افزونه‌ی Sariina_Test یک فایل composer.json مانند زیر ایجاد می‌کنیم:


{
"name": "sariina/test",
"description": "Sariina Test extension for composer.",
"keywords": ["magento","sariina","test","composer"],
"license": "copyright",
"Author": "Sariina IT Co.",
"type": "magento-module",
"require":{
"magento-hackathon/magento-composer-installer": "*"
}
}

view raw

composer.json

hosted with ❤ by GitHub

از تمام ویژگی‌های بالا تنها name و description برای کامپوزر ضروری هستند. اما برای اینکه افزونه‌ی ما بتواند در مجنتو نصب شود، ما دو ویژگی دیگر هم نیاز داریم: type و require.
مقدار type را همیشه باید magento-module قرار دهید. دقت کنید که حتی اگر می‌خواهید یک تم مجنتو نصب کنید، نباید این مقدار را تغییر دهید.
برای require می‌توانید هر تعداد افزونه یا کتابخانه که افزونه‌ی شما نیاز دارد وارد کنید اما همیشه باید magento-hackathon/magento-composer-installer را ذکر کنید.

magento-composer-installer
magento-composer-installer کمک می‌کند تا افزونه‌های مجنتو نصب شوند و قابلیت autoload ابزار composer در مجنتو فعال شود تا حتی پکیج‌هایی که به مجنتو ربطی ندارند بتوانند روی آن کار کنند. پس در تمام افزونه‌ها باید این پکیج به عنوان نیازمندی ذکر شود. در مراحل بعدی می‌بینید که چطور این پکیج فایل‌های موجود در افزونه‌ی ما را به جاهای مناسب منتقل می‌کند.

قدم چهارم: فایل modman

modman یا module manager ابزاری است که نصب کردن افزونه‌ها یا پکیج‌ها را روی نرم‌افزارهایی که انتظار دارند فایل‌ها در جای مشخصی باشند آسان می‌کند. به طور مثال اگر با Laravel کار کرده باشید می‌دانید که لازم نیست پکیج‌ها در جای مشخصی باشند. می‌توانید نام پوشه‌ی vendor را به هر چیزی که می‌خواهید تغییر دهید. اما در مجنتو این کار امکان‌پذیر نیست. بنابراین modman به ما کمک می‌کند فایل‌ها را در جای مناسب، یعنی آنجایی که نرم‌افزار مورد استفاده‌مان تعیین کرده است قرار دهیم. برای این کار کافی است یک فایل با نام modman در شاخه‌ی اصلی افزونه ایجاد کنیم و در هر خط از فایل بگوییم چه فایلی از افزونه باید در کدام مسیر از مجنتو قرار بگیرد. به طور مثال برای افزونه‌ی Sariina_Test فایل modman به این صورت نوشته می‌شود:

  • app/code/local/Sariina/Test/etc/config.xml app/code/local/Sariina/Test/etc/config.xml
  • app/code/local/Sariina/Test/Model/Test.php app/code/local/Sariina/Test/Model/Test.php
  • app/etc/modules/Sariina_Test.xml
  • app/etc/modules/Sariina_Test.xml
  • app/design/frontend/layout/sariina/test/layout.xml app/design/frontend/layout/sariina/test/layout.xml
  • skin/frontend/css/sariina/test.css skin/frontend/css/sariina/test.css

در هر خط، قسمت اول، مسیر فایل در پکیج ما و قسمت دوم مسیر فایل در مجنتو است. به طور مثال خط اول، فایل موجود در مسیر app/code/local/Sariina/Test/etc/config.xml در شاخه‌ی افزونه‌ی ما را به مسیر app/code/local/Sariina/Test/etc/config.xml در مجنتو کپی می‌کند.

اصلاحیه
در اینجا لازم است به دو نکته اشاره کنم. یکی اینکه ما واقعاً با ابزار modman کار نمی‌کنیم. می‌توانید مستندات modman را روی صفحه‌ی githubشان بخوانید. ما فایل modman را برای استفاده‌ی magento-composer-installer ایجاد می‌کنیم. می‌توانید به جای فایل modman از فایل package.xml (یک نمونه‌اش را می‌توانید اینجا ببینید) استفاده کنید. اما ایجاد فایل modman و فهمیدنش برای ما راحت‌تر است. ما در سارینا شل اسکریپت کوچکی داریم که با توجه به فایل‌های اضافه شده در گیت و فایل .gitignore فایل modman را تولید می‌کند. می‌توانید همین اسکریپت را بهبود دهید و استفاده کنید یا اسکریپت دیگری برای خودتان بنویسید:


#!/bin/sh
# usage: ./modman-generator module-dir-name
cd $1
echo "Generating magento modman file in $1"
rm -f modman
git ls-files | egrep -v '.svn|composer.json|modman|.gitignore|README|package.xml|.sass-cache|LICENSE.txt|readme.*' | awk -F'\t' '{print $1 " " $1}' >> modman

نکته‌ی دوم این است که گفتیم فایل‌های موجود در افزونه در مسیر درست‌شان در مجنتو «کپی» می‌شوند. این جمله همیشه درست نیست. می‌توان magento-composer-installer را مجبور کرد تا فایل‌ها را symlink کند. کاری که اگر از لینوکس استفاده می‌کنید توصیه می‌شود. راجع به این موضوع در مراحل بعد توضیح بیشتری می‌دهم.

قدم پنجم: یک فایل composer.json دیگر

ما در قدم سوم یک فایل composer.json ایجاد کردیم تا مشخصات پکیج خودمان را در آن شرح دهیم تا composer بتواند پکیج ما را از سایر پکیج‌ها تشخیص دهد. اما حالا به یک فایل composer.json دیگر نیاز داریم. این فایل را باید در شاخه‌ی اصلی مجنتو بسازیم و در آن تمام افزونه‌هایی که نیاز داریم را ذکر کنیم تا composer آنها را دریافت و magento-composer-installer آنها را نصب کند. در این فایل دیگر لازم نیست ویژگی‌هایی مثل description، license و غیره داشته باشیم. این فایل را برای این می‌سازیم تا composer بداند ما به چه افزونه‌هایی نیاز داریم. به طور مثال اگر بخواهید افزونه‌ی Sariina_Test را در مجنتو نصب کنید باید یک فایل composer.json در شاخه‌ی اصلی مجنتو با محتویات زیر بسازید:


{
"require": {
"sariina/test": "dev-master",
},
"repositories": [
{
"packagist": false
},
{
"type":"composer",
"url":"http://packages.firegento.com"
},
{
"type": "vcs",
"url": "ssh://git@repos.sariina.com/sariina/test.git"
}
],
"extra": {
"magento-root-dir":"./",
"magento-deploystrategy":"symlink",
"magento-force":true
}
}

view raw

composer.json

hosted with ❤ by GitHub

در قسمت require هر تعداد که لازم باشد افزونه قرار می‌دهیم. در قسمت اول نام افزونه‌ها را از فایل composer.json مربوط به هرکدام از افزونه‌ها استخراج می‌کنیم و در قسمت دوم نسخه‌ای را که می‌خواهیم نصب کنیم می‌نویسیم. dev-master یعنی آخرین نسخه از شاخه‌ی master در ریپازیتوری.
در قسمت repositories اطلاعات مربوط به آدرس ریپازیتوری‌ها را می‌نویسیم. از طریق این قسمت composer می‌فهمد پکیج‌ها را باید از کجا دریافت کند. اولین کار این است که packagist را غیرفعال کنیم. packagist مخزن ریپازیتوری پیش‌فرض composer است و از آنجایی که ما به هیچکدام از پکیج‌های خارج از مجنتو نیازی نداریم آن را غیرفعال می‌کنیم تا تداخل اسمی پیش نیاید. بعد مخزن firegento را اضافه می‌کنیم تا از طریق آن magento-composer-installer دریافت شود، و بعد مسیر افزونه‌ی Sariina_Test را که در قدم دوم ایجادش کردیم اضافه می‌کنیم.
در قسمت extra تنظیمات مربوط به magento-composer-installer را اضافه می‌کنیم. magento-root-dir شاخه‌ی اصلی مجنتو را مشخص می‌کند. magento-deploystrategy مشخص می‌کند که فایل‌ها باید کپی شوند یا می‌توانند symlink باشند. اگر از لینوکس استفاده می‌کنید بهتر است این گزینه را روی symlink تنظیم کنید، چون بعد می‌توانید تغییرات‌تان را به راحتی روی ریپازیتوری push کنید. magento-force هم برای این است که اگر فایلی که در حال کپی شدن است وجود داشت بازنویسی شود. در غیر اینصورت با خطا مواجه می‌شوید.

قدم ششم: composer install

حالا با دستور composer install افزونه‌ها دریافت می‌شوند، در شاخه‌ی vendor ذخیره می‌شوند و از آنجا در پوشه‌های لازم قرار می‌گیرند تا مجنتو بتواند آنها را بخواند.

توجه کنید که اگر فایل‌های افزونه را symlink کرده‌اید در ادمین مجنتو در مسیر System > Configuration > Developer > Template Settings گزینه‌ی Allow Symlinks را فعال کنید.

از حالا به بعد هر تغییری را که در افزونه بدهید می‌توانید در شاخه‌ی vendor ببینید و در ریپازیتوری push کنید. اگر از گزینه‌ی کپی استفاده می‌کنید باید تغییرات را به صورت دستی در شاخه‌ی افزونه در vendor کپی کنید و بعد push کنید.

مزیت این روش این است که اگر برنامه‌نویس یا طراح دیگری بخواهد روی پروژه کار کند، کافی است مراحل زیر را انجام دهد:

یک مجنتوی خام نصب کند.
فایل composer.json را از شما یا از ریپازیتوری دریافت کند.
دستور composer install را اجرا کند.

بقیه‌ی کارها توسط composer انجام می‌شود. هر وقت افزونه‌ی شما بروز شد و تغییرات جدیدی در آن اعمال کردید می‌توانید با دستور composer update آن را روی فروشگاه خود نصب و بروز کنید. اگر با چندین مجنتو روی چندین سرور کار می‌کنید، بهترین و سریع‌ترین ابزار برای مدیریت افزونه‌ها composer است. امتحانش کنید.

از سال ۸۵ برنامه‌نویسی را با نوشتن یک بازی ساده با ++C شروع کرد. به زبان PHP مسلط است و با سیستم‌های مدیریت محتوای زیادی مثل دروپال، وردپرس، بیتریکس و مجنتو آشنایی دارد. درحال حاضر در سارینا با Magento، Laravel و Ruby on Rails کار می‌کند. عاشق سرک کشیدن در تکنولوژی‌های جدید، خواندن کتاب و موسیقی راک است.