<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های genius.ha</title><link>https://virgool.ir/feed/@genius.ha</link><description></description><language>fa</language><pubDate>2026-11-11 00:29:26</pubDate><image><url>https://files.virgool.ir/upload/users/165240/avatar/hokl4A.png</url><title>genius.ha</title><link>https://virgool.ir/@genius.ha</link></image><item><title>نصب دروپال بر روی vps مرحله چهارم</title><link>https://virgool.ir/@genius.ha/نصب-دروپال-بر-روی-vps-مرحله-چهارم-udcyihuzcujl</link><description>drupalنصب دروپال بر روی vps مرحله اولنصب دروپال بر روی vps مرحله دوم نصب دروپال بر روی vps مرحله سومبرای نصب phpmyadmin  به صورت زیر عمل میکنیمsudo apt update&#xA;&#xA;sudo apt install phpmyadminچون ما از nginx  استفاده میکنیم در هنگام نصب هیچ یک از گزینه های apache2 و یا lighttpd را انتخاب نمیکنیمبعد از نصب باید در  nginx  دسترسی به پوشه phpmyadmin  را بدهیمsudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadminدر مرحله بعد باید یک فایل سرور بلاک برای phpmyadmin ایجاد کنیمsudo nano /etc/nginx/sites-available/phpmyadmin.confو کد زیر را جایگزاری میکنیمserver {&#xA;        listen 80 default_server;&#xA;        listen [::]:80 default_server;&#xA;        root /var/www/html;&#xA;&#xA;        # Add index.php to the list if you are using PHP&#xA;        index index.php index.html index.htm index.nginx-debian.html;&#xA;&#xA;        server_name IP ADDRESS;&#xA;&#xA;        location ~ \.php$ {&#xA;            include snippets/fastcgi-php.conf;&#xA;            fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;&#xA;            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;&#xA;            include fastcgi_params;&#xA;        }&#xA;}و فایل default را از مسیر /etc/nginx/sites-available حذف میکنیمsudo rm -rf /etc/nginx/sites-enabled/defaultدر ادامهsudo ln -s /etc/nginx/sites-available/phpmyadmin.conf /etc/nginx/sites-enabled/&#xA;&#xA;&#xA;sudo nginx -tو در آخر nginx را ریستارت میکنیمsudo systemctl restart nginxبا آدرس زیر میتوانید وارد phpmyadmin بشینhttp://ip/phpmyadmin/دروپال8drupal8</description><category>genius.ha</category><author>genius.ha</author><pubDate>Fri, 17 Apr 2020 15:26:17 +0430</pubDate></item><item><title>نصب دروپال بر روی vps مرحله سوم</title><link>https://virgool.ir/@genius.ha/نصب-دروپال-بر-روی-vps-مرحله-سوم-cbmiyqyuwfzc</link><description>drupalنصب دروپال بر روی vps مرحله اولنصب دروپال بر روی vps مرحله دومنصب composer بر روی vpsphp -r &#34;copy(&#39;https://getcomposer.org/installer&#39;, &#39;composer-setup.php&#39;);&#34;HASH=&#34;$(wget -q -O - https://composer.github.io/installer.sig)&#34;php -r &#34;if (hash_file(&#39;SHA384&#39;, &#39;composer-setup.php&#39;) === &#39;$HASH&#39;) &#xA;{ echo &#39;Installer verified&#39;; } else { echo &#39;Installer corrupt&#39;; unlink(&#39;composer-setup.php&#39;); } echo PHP_EOL;&#34;sudo 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&#xA;sudo nano ~/.bashrc&#xA;export PATH=&#34;$HOME/.composer/vendor/bin:$PATH&#34;&#xA;&#xA;&#xA;&#xA;&#xA;source ~/.bashrcو در آخرdrush status</description><category>genius.ha</category><author>genius.ha</author><pubDate>Fri, 17 Apr 2020 15:23:19 +0430</pubDate></item><item><title>نصب دروپال بر روی vps مرحله دوم</title><link>https://virgool.ir/@genius.ha/نصب-دروپال-بر-روی-vps-مرحله-دوم-gpwhsf26gigu</link><description>drupaldrupalنصب دروپال بر روی vps مرحله اولتنظیم فایروال:میخواهیم فایروال برای nginx تنظیم کنیم در اینجا ufw داریم که به صورت زیر عمل میکنیم :sudo ufw app listو خروجی :Apache&#xA;  Apache Full&#xA;  Apache Secure&#xA;  Bind9&#xA;  Nginx Full&#xA;  Nginx HTTP&#xA;  Nginx HTTPS&#xA;  OpenSSHو دستواات به شکل زیر وارد میکنیم :sudo ufw allow &#39;Nginx HTTP&#39;خروجیRules updated&#xA;Rules updated (v6)همینطور برای apachesudo ufw allow &#39;Apache&#39;در ادامه نصب phpsudo add-apt-repository ppa:ondrej/php&#xA;sudo apt-get updatesudo apt-get install php7.3و پلاگین هاsudo apt install php7.3-cli php7.3-fpm php7.3-json php7.3-pdo php7.3-mysql php7.3-zip php7.3-gd  php7.3-mbstring php7.3-curl php7.3-xml php7.3-bcmath php7.3-jsonنصب MariaDBsudo apt install mariadb-server mariadb-clientو در مرحله بعد پیکربندی mysqlmysql_secure_installationساخت دایرکتوری برای دامنهsudo mkdir /var/www/html/drupalweb.ir&#xA;&#xA;&#xA;sudo chown -R $USER:$USER /var/www/html/drupalweb.ir&#xA;&#xA;&#xA;&#xA;sudo nano /etc/nginx/sites-available/drupalweb.irو کد های زیر را در فایل ایجاد شده جایگزاری میکنیمserver {&#xA;    listen 80;&#xA;    listen [::]:80;&#xA;    root /var/www/html/drupalweb.ir;&#xA;    index  index.php index.html index.htm;&#xA;    server_name  drupalweb.ir www.drupalweb.ir;&#xA;&#xA;     client_max_body_size 100M;&#xA;&#xA;     location / {&#xA;&#x9;try_files $uri $uri/ @rewrite;&#xA;      }&#xA;&#xA;      location @rewrite {&#xA;&#x9;rewrite ^/(.*)$ /index.php;&#xA;      }&#xA;&#xA;     location ^~ /maintenance/ {&#xA;&#x9;return 403;&#xA;     }&#xA;&#xA;    location ~ \.php$ {&#xA;         include snippets/fastcgi-php.conf;&#xA;         fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;&#xA;         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;&#xA;         include fastcgi_params;&#xA;    }&#xA;}در ادامه کد زیر را اجرا میکنیمsudo ln -s /etc/nginx/sites-available/drupalweb.ir /etc/nginx/sites-enabled/در ادامهsudo nginx -t&#xA;&#xA;&#xA;sudo systemctl reload nginxنصب دروپالنصب دروپال بر روی vpsنصب دروپال بر روی سرور مجازی</description><category>genius.ha</category><author>genius.ha</author><pubDate>Fri, 17 Apr 2020 15:17:05 +0430</pubDate></item><item><title>نصب دروپال بر روی vps مرحله اول</title><link>https://virgool.ir/@genius.ha/نصب-دروپال-بر-روی-vps-مرحله-اول-bjpzl72bd2sb</link><description>drupalسلاممیخوهیم دروپال رو در یک سرور مجازی نصب کنیم ubuntu 18بعد از خرید سرور مجازی از طرف سرور دهنده به شما یک ip داده خواهد شداولین مرحله :تنظیم dns serverdomain name: drupalweb.irip: 148.251.112.92:  nameserverns1.drupalweb.irns2.drupalweb.irحالا روی سرور bind رو نصب میکنیمsudo apt-get install bind9 bind9utils bind9-docبعد از نصب bind وارد شاخه /etc/bind میشیم و فایل named.conf.options را ویرایش میکنیمcd /etc/bindnano named.conf.optionsباید دستور:// forwarders {&#xA;//      0.0.0.0;&#xA;// };رو به دستورforwarders {&#xA;      8.8.4.4;&#xA; };بعد سیو کنیددر این مرحله باید فایل zone دامنه رو بسازیمیک فایل ایجاد میکنیم به اسم drupalweb.ir.db  در /etc/bindبا محتوای;&#xA;; BIND data file for drupalweb.ir&#xA;;&#xA;$TTL    3h&#xA;@       IN      SOA     ns1.drupalweb.ir. email.drupalweb.ir. (&#xA;                          1        ; Serial&#xA;                          3h       ; Refresh after 3 hours&#xA;                          1h       ; Retry after 1 hour&#xA;                          1w       ; Expire after 1 week&#xA;                          1h )     ; Negative caching TTL of 1 day&#xA;;&#xA;@       IN      NS      ns1.drupalweb.ir.&#xA;@       IN      NS      ns2.drupalweb.ir.&#xA; &#xA; &#xA;drupalweb.ir.    IN      MX      10      mail.drupalweb.ir.&#xA;drupalweb.ir.    IN      A       148.251.112.92&#xA;ns1                     IN      A       148.251.112.92&#xA;ns2                     IN      A       148.251.112.92&#xA;www                     IN      CNAME   drupalweb.ir.&#xA;mail                    IN      A       148.251.112.92&#xA;ftp                     IN      CNAME   drupalweb.ir.در این مرحله باید فایل zone رو معرفی کنیم به bind در شاخه /etc/bind فایل named.conf.local را ادیت میکنیم و آدرس فایل zone که در مرحله قبل ساختیم بهش معرفی میکنیمzone &#34;drupalweb.ir&#34; {&#xA;       type master;&#xA;       file &#34;/etc/bind/drupalweb.ir.db&#34;&#xA;};سپس سرویس bind را رستارت میکنیمservice bind9 restartدر این مرحله باید تست کنیم که همه چیز درست هست یا نه !اول دستور زیر را اجرا میکنیمdig @148.251.112.92 drupalweb.irحالا باید nginx رو نصب کنیمsudo apt update&#xA;&#xA;&#xA;sudo apt install nginxدستورات برای راه اندازی و توقف nginxstop//&#xA;&#xA;sudo systemctl stop nginx&#xA;&#xA;start//&#xA;&#xA;sudo systemctl start nginx&#xA;&#xA; restart//&#xA;&#xA;sudo systemctl restart nginx&#xA;&#xA;relod//&#xA;&#xA;sudo systemctl reload nginx&#xA;&#xA;disable//&#xA;&#xA;sudo systemctl disable nginx&#xA;&#xA;enable//&#xA;&#xA;&#xA;sudo systemctl enable nginxدر مرحله بعد میتوانیم apache رو رو سیتم داشته باشیمsudo apt-get update&#xA;&#xA;sudo apt-get install apache2دستورات برای راه اندازی و توقف apache//stop&#xA;&#xA;sudo systemctl stop apache2&#xA;&#xA;&#xA;//start&#xA;&#xA;&#xA;sudo systemctl start apache2&#xA;&#xA;//restart&#xA;&#xA;&#xA;sudo systemctl restart apache2&#xA;&#xA;//reload&#xA;&#xA;sudo systemctl reload apache2&#xA;&#xA;//disable&#xA;&#xA;sudo systemctl disable apache2&#xA;&#xA;//enable&#xA;&#xA;sudo systemctl enable apache2نصب دروپالنصب دروپال بر روی vpsنصب دروپال بر روی سرور مجازی</description><category>genius.ha</category><author>genius.ha</author><pubDate>Fri, 17 Apr 2020 15:14:36 +0430</pubDate></item><item><title>شروع کار با React در دروپال 8</title><link>https://virgool.ir/@genius.ha/شروع-کار-با-react-در-دروپال-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(&#39;laravel-mix&#39;);&#xA;&#xA;mix.react(&#39;src/index.js&#39;, &#39;dist&#39;);ساختpackage.json  به صورت زیر&#34;scripts&#34;: {&#xA;  &#34;dev&#34;: &#34;npm run development&#34;,&#xA;  &#34;development&#34;: &#34;cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js&#34;,&#xA;  &#34;watch&#34;: &#34;npm run development -- --watch&#34;,&#xA;  &#34;hot&#34;: &#34;cross-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&#34;,&#xA;  &#34;prod&#34;: &#34;npm run production&#34;,&#xA;  &#34;production&#34;: &#34;cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js&#34;&#xA;},برای دیویلوپ کردن از دستور زیر استفاده کنید$ npm run watchبرای ساخت پروژه نهایی از دستور زیر$ npm run production</description><category>genius.ha</category><author>genius.ha</author><pubDate>Fri, 17 Apr 2020 15:13:08 +0430</pubDate></item><item><title>سرچ در یک آبجکت با استفاده از input</title><link>https://virgool.ir/@genius.ha/سرچ-در-یک-آبجکت-با-استفاده-از-input-lcq13mvbywqe</link><description>javascriptسلام میخوام در این آموزش یک سرچ ساده در یک آبجکت انجام بدیم که مقدار اولیه از یک input گرفته میشوددر مرحله اول باید قسمت html کار رو بنویسیم&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&lt;head&gt;&#xA;    &lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;    &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt;&#xA;    &lt;title&gt;hello world&lt;/title&gt;&#xA;    &#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;    &lt;input type=&#34;text&#34; id=&#34;input-search&#34;&gt;&#xA;&lt;/body&gt;&#xA;&lt;script src=&#34;app.js&#34;&gt;&#xA;&lt;/html&gt;در مرحله بعد در فایل app.js یک آبجیکت تعیرف میکنیم که شامل مقادیری می باشد که باید درآن سرچ شود که ممکن است این آبجکت از از داکیومنت html گرفته شودconst products = [&#xA;    {&#xA;        title:&#39;node js learning&#39;&#xA;    },&#xA;    {&#xA;        title:&#39;es6 js learning&#39;&#xA;    },&#xA;    {&#xA;        title:&#39;php&#39;&#xA;    },&#xA;]در مرحله بعد یک أبجکت تعریف میکنیم که مقادیر سرچ شده را در درون خود نگه میداردconst filters = {&#xA;    searchItem:&#39;&#39;&#xA;}و در ادامه یک تابع که در درون آبجکت فیلتر انجام میدهد و مقادیر را درون آبجکت filters ذخیره میکندconst rebderProdoucrs = function(products, filter){&#xA;    const filP = products.filter(function(item){&#xA;        return item.title.toLowerCase().includes(filter.searchItem.toLowerCase())&#xA;    })&#xA;    console.log(filP)&#xA;}و حالا باید مقادیر که مقادیر را از input بگیریم و بر روی تابع اعمال کنیمdocument.querySelector(&#39;#input-search&#39;).addEventListener(&#39;input&#39;, function(e){&#xA;    filters.searchItem = e.target.value&#xA;    rebderProdoucrs(products, filters) &#xA;})آموزش es6</description><category>genius.ha</category><author>genius.ha</author><pubDate>Fri, 17 Apr 2020 15:11:16 +0430</pubDate></item><item><title>سرچ در یک آبجکت با استفاده از input قسمت 2</title><link>https://virgool.ir/@genius.ha/سرچ-در-یک-آبجکت-با-استفاده-از-input-قسمت-2-r8hmkwqqjbor</link><description>javascriptدر قسمت قبل (سرچ در یک آبجکت با استفاده از input) اینکه یک سرچ در یک آبجکت انجام بدیم و در console نمایش بدیم نوشتیم و در این قسمت میخوهیم مقادیر أبجکت ها را در داکیومنت نمایش بدیمخوب ابتدا باید در سند html یک div ایجاد کنیم که مقادیر آبجکت سرچ شده رو درون خود نگه داری کندو سند html را به صورت زیر تغییر میدهمی&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&lt;head&gt;&#xA;    &lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;    &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt;&#xA;    &lt;title&gt;hello world&lt;/title&gt;&#xA;    &#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;    &lt;input type=&#34;text&#34; id=&#34;input-search&#34;&gt;&#xA;    &lt;div id=&#34;products&#34;&gt;&lt;/div&gt;&#xA;&lt;/body&gt;&#xA;&lt;script src=&#34;app.js&#34;&gt;&#xA;&lt;/html&gt;در ادامه در فایل app.js باید این تگ را بگیریم و با استفاده و مقادیر سرچ شده را به صورت زیر اضافه کینمconst products = [&#xA;    {&#xA;        title:&#39;node js learning&#39;&#xA;    },&#xA;    {&#xA;        title:&#39;es6 js learning&#39;&#xA;    },&#xA;    {&#xA;        title:&#39;php&#39;&#xA;    },&#xA;]&#xA;const filters = {&#xA;    searchItem:&#39;&#39;&#xA;}&#xA;const rebderProdoucrs = function(products, filter){&#xA;    const filP = products.filter(function(item){&#xA;        return item.title.toLowerCase().includes(filter.searchItem.toLowerCase())&#xA;    })&#xA;    document.querySelector(&#39;#products&#39;) = &#39;&#39;&#xA;    filP.forEach(item =&gt; {&#xA;        const productel = document.createElement(&#39;p&#39;)&#xA;        productel.textContent = item.title&#xA;        document.querySelector(&#39;#products&#39;)(productel)&#xA;    });&#xA;}&#xA;&#xA;document.querySelector(&#39;#input-search&#39;).addEventListener(&#39;input&#39;, function(e){&#xA;    filters.searchItem = e.target.value&#xA;    rebderProdoucrs(products, filters) &#xA;})آموزش es6</description><category>genius.ha</category><author>genius.ha</author><pubDate>Fri, 17 Apr 2020 15:10:32 +0430</pubDate></item><item><title>ایجاد controller در symfony</title><link>https://virgool.ir/@genius.ha/ایجاد-controller-در-symfony-vsxze3mggvau</link><description>symfonyمیخواهیم یک کنترلر در symfony ایجاد کنیم و در نهایت خروجی json داشته باشیم :بعد از نصب symfony و استارت سرور در پوشه src در پوشه Controller یک فایل به اسم BlogController ایجلد میکنیمclass BlogController extends AbstractController&#xA;{}در قسمت بعد میخواهیم 3 صفحه داشته باشیم که تمامی پست ها و یک پست سرچ یک پست را ببینیمبه همین ترتیب 3 تابع به همین نام ها ایجاد ایجاد میکنیمpublic function list()&#xA;    {}&#xA;&#xA;&#xA;    public function post()&#xA;    {}&#xA;&#xA;&#xA;&#xA;    public function postBYSlug()&#xA;    {}برای roure در symfony  ما به صورت حاشیه نویسی و از Annotation  استفاده میکنیم که میتوانید با استفاده از دستور زیر آن را نصب کیندcomposer require annotationsما در اینجا میخواهیم پست های وبلاگ خودمون را از یک تابع که به صورت private تعیرف کرده ایم بگیریم که به صورت زیر استprivate const POST = [&#xA;        [&#xA;            &#39;id&#39; =&gt; 1,&#xA;            &#39;slug&#39; =&gt; &#39;hello world&#39;,&#xA;            &#39;title&#39; =&gt; &#39;hello world&#39;&#xA;        ],&#xA;        [&#xA;            &#39;id&#39; =&gt; 2,&#xA;            &#39;slug&#39; =&gt; &#39;one hello world&#39;,&#xA;            &#39;title&#39; =&gt; &#39;one hello world&#39;&#xA;        ],&#xA;        [&#xA;            &#39;id&#39; =&gt; 3,&#xA;            &#39;slug&#39; =&gt; &#39;two  hello world&#39;,&#xA;            &#39;title&#39; =&gt; &#39;two hello world&#39;&#xA;        ],&#xA;    ];که در تابع اول میخواهیم تمامی پست ها رو ببینیم/**&#xA;     * @Route(&#34;/{page}&#34;, name=&#34;blog_list &#34;, defaults={&#34;page&#34;: 5 })&#xA;     */&#xA;    public function list($page = 1)&#xA;    {&#xA;        return new JsonResponse(&#xA;            [&#xA;                &#39;page&#39; =&gt; $page,&#xA;                &#39;data&#39; =&gt; array_map(function ($item){&#xA;                    return $this-&gt;generateUrl(&#39;blog_by_id&#39;, [&#39;id&#39; =&gt; $item[&#39;id&#39;]]);&#xA;                } ,self::POST)&#xA;            ]&#xA;        );&#xA;    }در تابع دوم یک پست را با استفاده از id/**&#xA;     * @Route(&#34;/post/{id}&#34;, name=&#34;blog_id &#34;)&#xA;     */&#xA;    public function post($id)&#xA;    {&#xA;        return new JsonResponse(&#xA;           self::POST[ array_search($id, array_column(self::POST, &#39;id&#39;))]&#xA;        );&#xA;    }و در تابع بعدی سرچ یک پست با استفاده از یک مقدار متغییر/**&#xA;     * @Route(&#34;/post/{slug}&#34;, name=&#34;blog_by_slug &#34;)&#xA;     */&#xA;    public function postBYSlug($slug)&#xA;    {&#xA;        return new JsonResponse(&#xA;            self::POST[array_search($slug, array_column(self::POST, &#39;slug&#39;))]&#xA;        );&#xA;    }که در نهاییت کد ما به شکل زیر می باشد&lt;?php&#xA;&#xA;&#xA;namespace App\Controller;&#xA;&#xA;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;&#xA;use Symfony\Component\HttpFoundation\JsonResponse;&#xA;use Symfony\Component\Routing\Annotation\Route;&#xA;&#xA;/**&#xA; * Class BlogController&#xA; * @Route(&#34;/blog&#34;)&#xA; */&#xA;class BlogController extends AbstractController&#xA;{&#xA;    private const POST = [&#xA;        [&#xA;            &#39;id&#39; =&gt; 1,&#xA;            &#39;slug&#39; =&gt; &#39;hello world&#39;,&#xA;            &#39;title&#39; =&gt; &#39;hello world&#39;&#xA;        ],&#xA;        [&#xA;            &#39;id&#39; =&gt; 2,&#xA;            &#39;slug&#39; =&gt; &#39;one hello world&#39;,&#xA;            &#39;title&#39; =&gt; &#39;one hello world&#39;&#xA;        ],&#xA;        [&#xA;            &#39;id&#39; =&gt; 3,&#xA;            &#39;slug&#39; =&gt; &#39;two  hello world&#39;,&#xA;            &#39;title&#39; =&gt; &#39;two hello world&#39;&#xA;        ],&#xA;    ];&#xA;&#xA;    /**&#xA;     * @Route(&#34;/{page}&#34;, name=&#34;blog_list &#34;, defaults={&#34;page&#34;: 5 })&#xA;     */&#xA;    public function list($page = 1)&#xA;    {&#xA;        return new JsonResponse(&#xA;            [&#xA;                &#39;page&#39; =&gt; $page,&#xA;                &#39;data&#39; =&gt; array_map(function ($item){&#xA;                    return $this-&gt;generateUrl(&#39;blog_by_id&#39;, [&#39;id&#39; =&gt; $item[&#39;id&#39;]]);&#xA;                } ,self::POST)&#xA;            ]&#xA;        );&#xA;    }&#xA;&#xA;    /**&#xA;     * @Route(&#34;/post/{id}&#34;, name=&#34;blog_by_id&#34;, requirements={&#34;id&#34;=&#34;\d+&#34;})&#xA;     */&#xA;    public function post($id)&#xA;    {&#xA;        return new JsonResponse(&#xA;           self::POST[ array_search($id, array_column(self::POST, &#39;id&#39;))]&#xA;        );&#xA;    }&#xA;&#xA;    /**&#xA;     * @Route(&#34;/post/{slug}&#34;, name=&#34;blog_by_slug &#34;)&#xA;     */&#xA;    public function postBYSlug($slug)&#xA;    {&#xA;        return new JsonResponse(&#xA;            self::POST[array_search($slug, array_column(self::POST, &#39;slug&#39;))]&#xA;        );&#xA;    }&#xA;&#xA;}ساخت وبلاگ در symfony</description><category>genius.ha</category><author>genius.ha</author><pubDate>Fri, 17 Apr 2020 15:09:10 +0430</pubDate></item><item><title>ایجاد entity در symfony</title><link>https://virgool.ir/@genius.ha/ایجاد-entity-در-symfony-xyny9acvqlxd</link><description>symfonyاولین مرحله باید  orm-pack را نصب کنیم برای نصب orm-pack به صورت زیر عمل میکنیم که doctrine نصب خواهد کردcomposer require symfony/orm-packو درمرجله بعدی نصب maker-bundlecomposer require --dev symfony/maker-bundleو بعد از تنظیمات database به صورت زیر عمل میکنیمدر مرحله اول با دستورphp bin/console make:entityیک entity ایجاد میکنیم  که با همین دستور میتوانید تمامی فیلد ها را ایجاد کنیدبعد از اینکه تمامی فیلد ها را ایجاد کردید میتوانید با استفاده از دستور زیر پایگاه داده را برای ایجاد جدول آماده کنیدphp bin/console make:migrationحالا با استفاده از دستور زیر جدول خود را ایجاد کنیدphp bin/console doctrin:migrations:migrate</description><category>genius.ha</category><author>genius.ha</author><pubDate>Fri, 17 Apr 2020 15:07:11 +0430</pubDate></item><item><title>آموزش ماژول نویسی دروپال 8 قسمت 6</title><link>https://virgool.ir/@genius.ha/آموزش-ماژول-نویسی-دروپال-8-قسمت-6-ds9gpv2md4gl</link><description>drupalدر این اموزش به فرم ها در دروپال ۸ میپردازیم   در ادامه قصد داریم ماژول قبلی را گسترش داده و به فیلد های که جدید در دروپال8 اضافه شده است بپردازیمآموزش ماژول نویسی دروپال 8 قسمت 5آموزش ماژول نویسی دروپال 8 قسمت 4آموزش ماژول نویسی دروپال 8 قسمت 3آموزش ماژول نویسی دروپال 8 قسمت 2آموزش ماژول نویسی دروپال 8 قسمت 1فرم های که به دروپال 8 اضافه شده اند به صوت زیر می باشدtele-mailnumberdateurlsearchrangecolorدر ادامه میخواهیم هر یک از فیلد ها را به مازول خودمون اضافه کنیم&lt;?php&#xA;namespace Drupal\custom\form;&#xA;use Drupal\Core\Form\FormBase;&#xA;use Drupal\Core\Form\FormInterface;&#xA;use Drupal\Core\Form\FormStateInterface;&#xA;&#xA;class CustomForm extends FormBase {&#xA;&#xA;  /**&#xA;   * Returns a unique string identifying the form.&#xA;   *&#xA;   * The returned ID should be a unique string that can be a valid PHP function&#xA;   * name, since it&#39;s used in hook implementation names such as&#xA;   * hook_form_FORM_ID_alter().&#xA;   *&#xA;   * @return string&#xA;   *   The unique string identifying the form.&#xA;   */&#xA;  public function getFormId() {&#xA;    return &#39;my_custom_form&#39;;&#xA;  }&#xA;  /**&#xA;   * Form constructor.&#xA;   *&#xA;   * @param array $form&#xA;   *   An associative array containing the structure of the form.&#xA;   * @param \Drupal\Core\Form\FormStateInterface $form_state&#xA;   *   The current state of the form.&#xA;   *&#xA;   * @return array&#xA;   *   The form structure.&#xA;   */&#xA;  public function buildForm(array $form, FormStateInterface $form_state) {&#xA;&#xA;    $form[&#39;description&#39;] = [&#xA;      &#39;#type&#39; =&gt; &#39;item&#39;,&#xA;      &#39;#markup&#39; =&gt; $this-&gt;t(&#39;Please enter&#xA;      the title and accept the terms of use of the site.&#39;),&#xA;    ];&#xA;    $form[&#39;title&#39;] = [&#xA;      &#39;#type&#39; =&gt; &#39;textfield&#39;,&#xA;      &#39;#title&#39; =&gt; $this-&gt;t(&#39;Title&#39;),&#xA;      &#39;#description&#39; =&gt; $this-&gt;t(&#39;Enter the title of&#xA;      the book. Note that the title must be at least 10 characters in length.&#39;),&#xA;      &#39;#required&#39; =&gt; TRUE,&#xA;    ];&#xA;    $form[&#39;phone&#39;] = array(&#xA;      &#39;#type&#39; =&gt; &#39;tel&#39;,&#xA;      &#39;#title&#39; =&gt; t(&#39;Your telephone number&#39;),&#xA;      &#39;#placeholder&#39; =&gt; &#39;+0 (000) 000-0000&#39;,&#xA;    );&#xA;    $form[&#39;email&#39;] = array(&#xA;      &#39;#type&#39; =&gt; &#39;email&#39;,&#xA;      &#39;#title&#39; =&gt; t(&#39;Your e-mail address&#39;),&#xA;      &#39;#placeholder&#39; =&gt; &#39;john @example.com&#39;,&#xA;    );&#xA;    $form[&#39;stepped_float&#39;] = array(&#xA;      &#39;#type&#39; =&gt; &#39;number&#39;,&#xA;      &#39;#title&#39; =&gt; t(&#39;This will allow the&#xA;       floating point numbers 2, 2.5, 3 and 3.5&#39;),&#xA;      &#39;#min&#39; =&gt; 2,&#xA;      &#39;#step&#39; =&gt; 0.5,&#xA;      &#39;#max&#39; =&gt; 3.5,&#xA;    );&#xA;    $form[&#39;integer&#39;] = array(&#xA;      &#39;#type&#39; =&gt; &#39;number&#39;,&#xA;      &#39;#title&#39; =&gt; t(&#39;This will allow only&#xA;      integers greater or equal to 41&#39;),&#xA;      &#39;#min&#39; =&gt; 41,&#xA;    );&#xA;    $form[&#39;float&#39;] = array(&#xA;      &#39;#type&#39; =&gt; &#39;number&#39;,&#xA;      &#39;#title&#39; =&gt; t(&#39;This will allow any&#xA;      floating point number smaller or equal to 100&#39;),&#xA;      &#39;#max&#39; =&gt; 100,&#xA;      &#39;#step&#39; =&gt; &#39;any&#39;,&#xA;    );&#xA;    $form[&#39;stepped_float&#39;] = array(&#xA;      &#39;#type&#39; =&gt; &#39;number&#39;,&#xA;      &#39;#title&#39; =&gt; t(&#39;This will allow the&#xA;      floating point numbers 2, 2.5, 3 and 3.5&#39;),&#xA;      &#39;#min&#39; =&gt; 2,&#xA;      &#39;#step&#39; =&gt; 0.5,&#xA;      &#39;#max&#39; =&gt; 3.5,&#xA;    );&#xA;    $form[&#39;background_color&#39;] = array(&#xA;      &#39;#type&#39; =&gt; &#39;color&#39;,&#xA;      &#39;#title&#39; =&gt; t(&#39;Pick a background color&#39;),&#xA;    );&#xA;    $form[&#39;date&#39;] = array(&#xA;      &#39;#type&#39; =&gt; &#39;date&#39;,&#xA;      &#39;#title&#39; =&gt; t(&#39;date&#39;),&#xA;      &#39;#date_data_format&#39; =&gt; &#39;Y-m-d&#39;,&#xA;    );&#xA;    $form[&#39;keyword&#39;] = array(&#xA;      &#39;#type&#39; =&gt; &#39;search&#39;,&#xA;      &#39;#title&#39; =&gt; t(&#39;Search&#39;),&#xA;      &#39;#placeholder&#39; =&gt; t(&#39;Enter a term to look up&#39;),&#xA;    );&#xA;    $form[&#39;accept&#39;] = array(&#xA;      &#39;#type&#39; =&gt; &#39;checkbox&#39;,&#xA;      &#39;#title&#39; =&gt; $this&#xA;        -&gt;t(&#39;I accept the terms of use of the site&#39;),&#xA;      &#39;#description&#39; =&gt; $this-&gt;t(&#39;Please read and accept the terms of use&#39;),&#xA;    );&#xA;    $form[&#39;actions&#39;] = [&#xA;      &#39;#type&#39; =&gt; &#39;actions&#39;,&#xA;    ];&#xA;    $form[&#39;actions&#39;][&#39;submit&#39;] = [&#xA;      &#39;#type&#39; =&gt; &#39;submit&#39;,&#xA;      &#39;#value&#39; =&gt; $this-&gt;t(&#39;Submit&#39;),&#xA;    ];&#xA;&#xA;    return $form;&#xA;&#xA;  }&#xA;  public function validateForm(array &amp;$form, FormStateInterface $form_state) {&#xA;    parent::validateForm($form, $form_state);&#xA;&#xA;    $title = $form_state-&gt;getValue(&#39;title&#39;);&#xA;    $accept = $form_state-&gt;getValue(&#39;accept&#39;);&#xA;&#xA;    if (strlen($title) &lt; 10) {&#xA;      // Set an error for the form element with a key of &#34;title&#34;.&#xA;      $form_state-&gt;setErrorByName(&#xA;        &#39;title&#39;, $this-&gt;t(&#xA;          &#39;The title must be at least 10 characters long.&#39;));&#xA;    }&#xA;&#xA;    if (empty($accept)){&#xA;      // Set an error for the form element with a key of &#34;accept&#34;.&#xA;      $form_state-&gt;setErrorByName(&#xA;        &#39;accept&#39;, $this-&gt;t(&#xA;          &#39;You must accept the terms of use to continue&#39;));&#xA;    }&#xA;&#xA;  }&#xA;  public function submitForm(array &amp;$form, FormStateInterface $form_state) {&#xA;    drupal_set_message($form_state-&gt;getValue(&#39;title&#39;));&#xA;    return;&#xA;  }&#xA;}آموزش ماژول نویسی دروپال 8فرم ها در دروپال 8فرم ها در drupal8</description><category>genius.ha</category><author>genius.ha</author><pubDate>Mon, 13 Apr 2020 11:12:11 +0430</pubDate></item><item><title>آموزش ماژول نویسی دروپال 8 قسمت 5</title><link>https://virgool.ir/@genius.ha/آموزش-ماژول-نویسی-دروپال-8-قسمت-5-kxjcjcausrob</link><description>در این اموزش به فرم ها در دروپال ۸ میپردازیمآموزش ماژول نویسی دروپال 8 قسمت 4آموزش ماژول نویسی دروپال 8 قسمت 3آموزش ماژول نویسی دروپال 8 قسمت 2آموزش ماژول نویسی دروپال 8 قسمت 1فرم ها در دروپال 8ما در این مرحله ماژولی را که نوشه بودیم گسترش میدهیمابتدا در روت اصلی ماژول یه پوشه جدید به اسم Form  ایجاد میکنیم و در پوشه ایجاد شده فایل به نام CustomForm.php ایجاد میکنیم و در فایل ایجاد شده کد ها را به صورت زیر مینویسیم&lt;?&lt;?php&#xA;namespace Drupal\custom\form;&#xA;use Drupal\Core\Form\FormBase;&#xA;use Drupal\Core\Form\FormInterface;&#xA;use Drupal\Core\Form\FormStateInterface;&#xA;&#xA;class CustomForm extends FormBase {&#xA;}در اینجا بک namespace برای فرم خودمون تعریف میکنمو مقادیر FormInterface و FormStateInterface برای این شاخه use  میکنیمدر ادامه باید برای این فرم یک form id ایجاد کینم/**&#xA;   * Returns a unique string identifying the form.&#xA;   *&#xA;   * The returned ID should be a unique string that can be a valid PHP function&#xA;   * name, since it&#39;s used in hook implementation names such as&#xA;   * hook_form_FORM_ID_alter().&#xA;   *&#xA;   * @return string&#xA;   *   The unique string identifying the form.&#xA;   */&#xA;  public function getFormId() {&#xA;    return &#39;my_custom_form&#39;;&#xA;  }بعد میتوانیم فیلد های خودمون رابه صورت زیر ایجاد کینم/**&#xA;   * Form constructor.&#xA;   *&#xA;   * @param array $form&#xA;   *   An associative array containing the structure of the form.&#xA;   * @param \Drupal\Core\Form\FormStateInterface $form_state&#xA;   *   The current state of the form.&#xA;   *&#xA;   * @return array&#xA;   *   The form structure.&#xA;   */&#xA;  public function buildForm(array $form, FormStateInterface $form_state) {&#xA;&#xA;    $form[&#39;description&#39;] = [&#xA;      &#39;#type&#39; =&gt; &#39;item&#39;,&#xA;      &#39;#markup&#39; =&gt; $this-&gt;t(&#39;Please enter the title and accept the terms of use of the site.&#39;),&#xA;    ];&#xA;    $form[&#39;title&#39;] = [&#xA;      &#39;#type&#39; =&gt; &#39;textfield&#39;,&#xA;      &#39;#title&#39; =&gt; $this-&gt;t(&#39;Title&#39;),&#xA;      &#39;#description&#39; =&gt; $this-&gt;t(&#39;Enter the title of the book. Note that the title must be at least 10 characters in length.&#39;),&#xA;      &#39;#required&#39; =&gt; TRUE,&#xA;    ];&#xA;&#xA;    $form[&#39;accept&#39;] = array(&#xA;      &#39;#type&#39; =&gt; &#39;checkbox&#39;,&#xA;      &#39;#title&#39; =&gt; $this&#xA;        -&gt;t(&#39;I accept the terms of use of the site&#39;),&#xA;      &#39;#description&#39; =&gt; $this-&gt;t(&#39;Please read and accept the terms of use&#39;),&#xA;    );&#xA;    $form[&#39;actions&#39;] = [&#xA;      &#39;#type&#39; =&gt; &#39;actions&#39;,&#xA;    ];&#xA;    $form[&#39;actions&#39;][&#39;submit&#39;] = [&#xA;      &#39;#type&#39; =&gt; &#39;submit&#39;,&#xA;      &#39;#value&#39; =&gt; $this-&gt;t(&#39;Submit&#39;),&#xA;    ];&#xA;&#xA;    return $form;&#xA;&#xA;  }برای فرم میتوانیم یک ولیدت ایجاد کنیمpublic function validateForm(array &amp;$form, FormStateInterface $form_state) {&#xA;    parent::validateForm($form, $form_state);&#xA;&#xA;    $title = $form_state-&gt;getValue(&#39;title&#39;);&#xA;    $accept = $form_state-&gt;getValue(&#39;accept&#39;);&#xA;&#xA;    if (strlen($title) &lt; 10) {&#xA;      // Set an error for the form element with a key of &#34;title&#34;.&#xA;      $form_state-&gt;setErrorByName(&#39;title&#39;, $this-&gt;t(&#39;The title must be at least 10 characters long.&#39;));&#xA;    }&#xA;&#xA;    if (empty($accept)){&#xA;      // Set an error for the form element with a key of &#34;accept&#34;.&#xA;      $form_state-&gt;setErrorByName(&#39;accept&#39;, $this-&gt;t(&#39;You must accept the terms of use to continue&#39;));&#xA;    }&#xA;&#xA;  }و در انتها مقدار submit را تعریف میکنمpublic function submitForm(array &amp;$form, FormStateInterface $form_state) {&#xA;    drupal_set_message($form_state-&gt;getValue(&#39;title&#39;));&#xA;    return;&#xA;  }در نهایت ماژول به صورت زیر خواهد بود&lt;?php&#xA;namespace Drupal\custom\form;&#xA;use Drupal\Core\Form\FormBase;&#xA;use Drupal\Core\Form\FormInterface;&#xA;use Drupal\Core\Form\FormStateInterface;&#xA;&#xA;class CustomForm extends FormBase {&#xA;&#xA;  /**&#xA;   * Returns a unique string identifying the form.&#xA;   *&#xA;   * The returned ID should be a unique string that can be a valid PHP function&#xA;   * name, since it&#39;s used in hook implementation names such as&#xA;   * hook_form_FORM_ID_alter().&#xA;   *&#xA;   * @return string&#xA;   *   The unique string identifying the form.&#xA;   */&#xA;  public function getFormId() {&#xA;    return &#39;my_custom_form&#39;;&#xA;  }&#xA;  /**&#xA;   * Form constructor.&#xA;   *&#xA;   * @param array $form&#xA;   *   An associative array containing the structure of the form.&#xA;   * @param \Drupal\Core\Form\FormStateInterface $form_state&#xA;   *   The current state of the form.&#xA;   *&#xA;   * @return array&#xA;   *   The form structure.&#xA;   */&#xA;  public function buildForm(array $form, FormStateInterface $form_state) {&#xA;&#xA;    $form[&#39;description&#39;] = [&#xA;      &#39;#type&#39; =&gt; &#39;item&#39;,&#xA;      &#39;#markup&#39; =&gt; $this-&gt;t(&#39;Please enter the title and accept the terms of use of the site.&#39;),&#xA;    ];&#xA;    $form[&#39;title&#39;] = [&#xA;      &#39;#type&#39; =&gt; &#39;textfield&#39;,&#xA;      &#39;#title&#39; =&gt; $this-&gt;t(&#39;Title&#39;),&#xA;      &#39;#description&#39; =&gt; $this-&gt;t(&#39;Enter the title of the book. Note that the title must be at least 10 characters in length.&#39;),&#xA;      &#39;#required&#39; =&gt; TRUE,&#xA;    ];&#xA;&#xA;    $form[&#39;accept&#39;] = array(&#xA;      &#39;#type&#39; =&gt; &#39;checkbox&#39;,&#xA;      &#39;#title&#39; =&gt; $this&#xA;        -&gt;t(&#39;I accept the terms of use of the site&#39;),&#xA;      &#39;#description&#39; =&gt; $this-&gt;t(&#39;Please read and accept the terms of use&#39;),&#xA;    );&#xA;    $form[&#39;actions&#39;] = [&#xA;      &#39;#type&#39; =&gt; &#39;actions&#39;,&#xA;    ];&#xA;    $form[&#39;actions&#39;][&#39;submit&#39;] = [&#xA;      &#39;#type&#39; =&gt; &#39;submit&#39;,&#xA;      &#39;#value&#39; =&gt; $this-&gt;t(&#39;Submit&#39;),&#xA;    ];&#xA;&#xA;    return $form;&#xA;&#xA;  }&#xA;  public function validateForm(array &amp;$form, FormStateInterface $form_state) {&#xA;    parent::validateForm($form, $form_state);&#xA;&#xA;    $title = $form_state-&gt;getValue(&#39;title&#39;);&#xA;    $accept = $form_state-&gt;getValue(&#39;accept&#39;);&#xA;&#xA;    if (strlen($title) &lt; 10) {&#xA;      // Set an error for the form element with a key of &#34;title&#34;.&#xA;      $form_state-&gt;setErrorByName(&#39;title&#39;, $this-&gt;t(&#39;The title must be at least 10 characters long.&#39;));&#xA;    }&#xA;&#xA;    if (empty($accept)){&#xA;      // Set an error for the form element with a key of &#34;accept&#34;.&#xA;      $form_state-&gt;setErrorByName(&#39;accept&#39;, $this-&gt;t(&#39;You must accept the terms of use to continue&#39;));&#xA;    }&#xA;&#xA;  }&#xA;  public function submitForm(array &amp;$form, FormStateInterface $form_state) {&#xA;    drupal_set_message($form_state-&gt;getValue(&#39;title&#39;));&#xA;    return;&#xA;  }&#xA;}میتوانیم یک route جدید برای فرم تعرف کنیم \mycustom.content:&#xA;  path: &#39;/hello&#39;&#xA;  defaults:&#xA;    _controller: &#39;Drupal\mycustom\Controller\MycustomController::content&#39;&#xA;    _title: &#39;Hello world&#39;&#xA;  requirements:&#xA;    _permission: &#39;my custom permisstion&#39;&#xA;mycustom.form:&#xA;  path: &#39;/csfrom&#39;&#xA;  defaults:&#xA;    _form: &#39;Drupal\mycustom\Form\MycustomForm&#39;&#xA;    _title: &#39;Hello world&#39;&#xA;  requirements:&#xA;    _permission: &#39;my custom permisstion&#39;آموزش ماژول نویسی دروپال 8فرم ها در دروپال 8</description><category>genius.ha</category><author>genius.ha</author><pubDate>Mon, 13 Apr 2020 11:11:12 +0430</pubDate></item><item><title>آموزش ماژول نویسی دروپال 8 قسمت 4</title><link>https://virgool.ir/@genius.ha/آموزش-ماژول-نویسی-دروپال-8-قسمت-4-ydy2lasaiiyu</link><description>drupalدر این آموزش قصد دارم ایجاد permission  در دروپال توضیح بدم یعنی شما بتونید برای صفحه ای که ایجاد کرده اید این امکان رو داشته باشید که کاربر خاصی به محتوای صفحه دسترسی داشته باشدآموزش ماژول نویسی دروپال 8 قسمت 3آموزش ماژول نویسی دروپال 8 قسمت 2آموزش ماژول نویسی دروپال 8 قسمت 1برای این مورد در شاخه ماژول یک فایل به اسم custom.permissions.yml ایجاد میکنیم و کد ها را به صورت زیر اضافه خواهیم کرد# In custom.permissions.yml file.&#xA;access all views:&#xA;  title: &#39;my custom permisstion&#39;&#xA;  description: &#39;A custom permission for your module settings page.&#39;&#xA;  restrict access: TRUEو در فایل custom.routing در قسمت requirements کد را به صورت زیر ویرایش میکنمrequirements:&#xA;    _permission: &#39;my custom permisstion&#39;بعد با پاک کردن کش و رفتن به صفحه مدیریت پرمیشن ها میتوانید به یک نقش خاص اجازه دسترسی به صفحه خودتون را دهیدآموزش ماژول نویسی دروپال 8</description><category>genius.ha</category><author>genius.ha</author><pubDate>Mon, 13 Apr 2020 11:10:07 +0430</pubDate></item><item><title>آموزش ماژول نویسی دروپال 8 قسمت 3</title><link>https://virgool.ir/@genius.ha/آموزش-ماژول-نویسی-دروپال-8-قسمت-3-terc6xas0f1x</link><description>drupalدر این قسمت از آموزش قصد داریم یک Controller  ایجاد کنیم و نتیجه کار را به صوت فیزیکی ببینیمدر قسمت ها قبلآموزش ماژول نویسی دروپال 8 قسمت 2آموزش ماژول نویسی دروپال 8 قسمت 1نحوه آموزش ساخت یک ماژول و ایجاد Routing در دروپال را یاد گرفیتم در این آموزش قصد داریم یک Controller ایجاد کنیمایجاد Controller  در drupal8 :ابتدا در شاخه ماژول یک پوشه به نام src ایجاد میکنم و در پوشه ایجاد شده پوشه دیگری به نام Controller ایجاد میکنم و یک فایل به نام CustomController.php میسازیم و کد ها را به صورت زیر مینویسیم&lt;?php&#xA;/**&#xA; * @file&#xA; * Contains \Drupal\custom\Controller\CustomController.&#xA; */&#xA;namespace Drupal\custom\Controller;&#xA;&#xA;use Drupal\Core\Controller\ControllerBase;&#xA;&#xA;class CustomController extends ControllerBase {&#xA;  public function content() {&#xA;    return array(&#xA;      &#39;#type&#39; =&gt; &#39;markup&#39;,&#xA;      &#39;#markup&#39; =&gt; t(&#39;Hello world&#39;),&#xA;    );&#xA;  }&#xA;}در کد بالا هر کلاس تعریف شده در دروپال 8 باید در یک فضای کاری یا به اصطلاح namespace قرار گیرد. این کار از این جهت لازم است که در صورت وجود کلاس ها با نام مشابه در زمان ارجاع به کلاس از بیرون تداخلی صورت نگیرد و هر کلاس با توجه به فضای کاری خود مورد ارجاع قرار گیرد. بنابراین این پارامتر را نیز اضافه کنید.حالا با یک بار پاک کردن کش دروپال و رفتن به صفحه /hello میتوانید نتیجه کار خودتون را ببینید \آموزش ماژول نویسی دروپال 8</description><category>genius.ha</category><author>genius.ha</author><pubDate>Mon, 13 Apr 2020 11:09:15 +0430</pubDate></item><item><title>آموزش ماژول نویسی دروپال 8 قسمت 2</title><link>https://virgool.ir/@genius.ha/آموزش-ماژول-نویسی-دروپال-8-قسمت-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:&#xA;  path: &#39;/hello&#39;&#xA;  defaults:&#xA;    _controller: &#39;Drupal\custom\Controller\CustomController::content&#39;&#xA;    _title: &#39;Hello world&#39;&#xA;  requirements:&#xA;    _permission: &#39;access content&#39;در قسمت path  مسیر را تعیین میکنمدر قسمت  defaults تعیین میکنیم که این مسیر چه ریسپانسی داشته باشد یعنی باید یک کنترلر ایجاد کنیم به اسم CustomController که مقداری که تعریف میکنم را برمیگرداند .\در آموزش بعد یک کنترلر تعریف میکنم و ماژول خودمان را گشترش میدهیمآموزش ماژول نویسی دروپال 8</description><category>genius.ha</category><author>genius.ha</author><pubDate>Mon, 13 Apr 2020 11:06:22 +0430</pubDate></item><item><title>آموزش ماژول نویسی دروپال 8 قسمت 1</title><link>https://virgool.ir/@genius.ha/آموزش-ماژول-نویسی-دروپال-8-قسمت-1-cdxyojb5ryak</link><description>drupalدر ابتدا میخواهیم  یک ماژول برای دروپال ۸ ایجاد کنیم همچنین میخواهیم یک پیج ایجاد کنیم و دسترسی های مربوط به پیج را اضافه کنیم و در آخر پیکربندی های مربوط به نصب ماژول برای دروپال ۸ را انجام دهیم .برای ایجاد یک ماژول جدید در دروپال در پوشه module رفته و یک پوشه به نام دلخواه ایجاد میکنیمدر پوشه ایجاد شده باید فایل .info.yml را ایجاد کردهمن نام ماژول خودم رو custom گذاشتم و فایل به صورت زیر ایجاد کیکنمcustom.info.ymlو فایل به صورت زیر مینویسیمname: custom&#xA;type: module&#xA;description : &#39;test module  drupal 8&#39;&#xA;core: 8.xشما میتوانید پیشنازهای برای این ماژول داشته باشید که به صورت زیر میتوانید آن ها را در ماژول خود بیان کنید \name: custom&#xA;type: module&#xA;description : &#39;test module  drupal 8&#39;&#xA;core: 8.x&#xA;dependencies:&#xA;  - drupal:breakpoint&#xA;  - drupal:imageدر آموزش بعدی ایجاد یک پیج سفارشی را آموزش خواهیم دادآموزش ماژول نویسی دروپال 8</description><category>genius.ha</category><author>genius.ha</author><pubDate>Sun, 05 Apr 2020 20:55:17 +0430</pubDate></item></channel></rss>