لماذا إمكانية الوصول (Accessibility) ليست مجرد "علامة صح"، بل تتعلق بأشخاص حقيقيين
\n\nتخيل أنك تدخل إلى موقع، لكن زر "شراء" لا يعمل. أو أن النص يندمج مع الخلفية مثل الحرباء على الأسفلت. بالنسبة لشخص ضعيف البصر أو يعاني من إعاقات حركية، هذا ليس "خطأ برمجيًا"، بل واقع يومي. إمكانية الوصول (a11y) ليست موضة عابرة، بل جسر يربط كودك بملايين المستخدمين.
\n\nفي العالم العربي، وفقًا لتقارير منظمة الصحة العالمية، هناك أكثر من 50 مليون شخص من ذوي الإعاقة. وإذا أضفنا كبار السن والأشخاص ذوي الإعاقات المؤقتة (يد مكسورة، شمس ساطعة) — يصبح الجمهور الذي يحتاج إلى إمكانية الوصول هائلاً. تطوير PHP مع مراعاة إمكانية الوصول ليس فقط أخلاقيًا، بل مربح أيضًا: محركات البحث تحب الترميز الدلالي، والمستخدمون يحبون سهولة الاستخدام.
\n\nفي هذه المقالة، سنشرح كيفية تطبيق مبادئ WCAG (إرشادات إمكانية الوصول لمحتوى الويب) مباشرة في كود PHP. بدون حشو، مع أمثلة عملية وحلول جاهزة.
\n\nمن أين نبدأ: الترميز الدلالي وPHP
\n\nيعتقد الكثيرون أن إمكانية الوصول تتعلق فقط بـ CSS وJavaScript. لكن جذر المشكلة غالبًا ما يكون في الجزء الخادم (Server-side). PHP يُنشئ HTML، وإذا كان هذا HTML "أصم" — فلن ينقذه أي Frontend.
\n\nالعناوين الصحيحة والهيكل السليم
\n\nقارئات الشاشة (Screen Readers) تعتمد على العناوين. إذا كان لديك في الصفحة <h1> واحد، ثم مباشرة <h3> — هذا مثل كتاب يبدأ بفهرس ثم ينتقل مباشرة إلى حاشية سفلية. يتم كسر التسلسل الهرمي.
النهج الخاطئ:
\n<?php\n// إنشاء محتوى بدون مراعاة الدلالات\necho '<div class="title">' . $title . '</div>';\necho '<div class="subtitle">' . $subtitle . '</div>';\n?>\n\nالنهج الصحيح (إمكانية الوصول في PHP):
\n<?php\n// هيكل دلالي لقارئات الشاشة\necho '<h1>' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '</h1>';\necho '<h2>' . htmlspecialchars($subtitle, ENT_QUOTES, 'UTF-8') . '</h2>';\n?>\n\nلاحظ استخدام htmlspecialchars() — هذا أساس الأمان وإمكانية الوصول. الرموز الخاصة في العناوين قد تكسر الترميز أو تُقرأ بشكل خاطئ.
خصائص ARIA: عندما لا يكفي HTML
\n\nARIA (تطبيقات الإنترنت الغنية القابلة للوصول) هي مجموعة من الخصائص التي تُكمل الدلالات. على سبيل المثال، إذا كنت تنشئ قائمة منسدلة مخصصة باستخدام PHP وJavaScript، يجب إخبار قارئ الشاشة: "هذا زر يفتح قائمة".
\n\nمثال على إنشاء زر متوافق مع ARIA:
\n<?php\nfunction renderAccessibleButton(string $label, string $id): string {\n return sprintf(\n '<button id="%s" aria-expanded="false" aria-controls="menu-%s">%s</button>',\n htmlspecialchars($id),\n htmlspecialchars($id),\n htmlspecialchars($label)\n );\n}\necho renderAccessibleButton('القائمة', 'main-menu');\n?>\n\nالخاصية aria-expanded تُخبر قارئ الشاشة ما إذا كانت القائمة مفتوحة أم لا. الخاصية aria-controls تربط الزر بالكتلة المنسدلة. هذا يشبه نظام GPS للمستخدم الكفيف.
التعامل مع النماذج: فخ إمكانية الوصول
\n\nالنماذج هي أكثر نقطة ضعف. المستخدم يملأ حقلًا، وقارئ الشاشة يقول: "تحرير نص". أي نص؟ لأي غرض؟ بدون تسميات، هذا يشبه المقامرة.
\n\nربط label و input
\n\nفي PHP، غالبًا ما تُنشئ الحقول ديناميكيًا. القاعدة الذهبية: كل <input> يجب أن يكون له <label> مع الخاصية for، أو يجب أن يكون الـ input نفسه مغلفًا داخل label.
مثال لنموذج ديناميكي:
\n<?php\n$fields = [\n 'name' => 'الاسم',\n 'email' => 'البريد الإلكتروني',\n 'phone' => 'رقم الهاتف'\n];\nforeach ($fields as $key => $label):\n?>\n <div class="form-group">\n <label for="input-&