لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 03/28/21 في كل الموقع
-
عملية التنظيم والهيكلة للمشروع تختلف بطبيعة الحال بإختلاف المشروع على إفتراض أن المشروع كبير مثلما تقول ويتم إستهلاك الكثير من الوقت في عملية الهيكله فيمكنك إتباع ال modular pattern حيث تقوم بقسيم المشروع الى عدة وحدات كل وحدة تحتوي علي فولدر خاص ب components الخاصه بهذه الوحدة بالاضافة الى فولدر services الخاص باللوجيك المسئول عن ال API وفولدر __tests__ يحوي عملية الاختبار لهذه الوحده في حالة كنت تريده فيكون على سبيل المثال تقسم المشروع كالتالي: ├── src │ ├── globals │ │ ├── contexts - يحتوي علي أي كونتكست │ │ ├── core.service.js - يحتوي على اللوجيك المستخدم مع ال API المشترك في المشروع بأكمله │ │ └── routes.js - يحتوي على جميل المسارات │ ├── index.js - الملف الرئيسي │ ├── modules - الوحدات المكونه للمشروع │ │ ├── blog │ │ │ ├── components │ │ │ │ ├── blogCard │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ ├── blogListPage │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ ├── CategoriesFilter │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ ├── SearchFilter │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ └── singleBlogPage │ │ │ │ ├── index.js │ │ │ │ └── style.module.css │ │ │ ├── services │ │ │ │ ├── blog.service.js │ │ │ │ └── category.service.js │ │ │ └── __tests__ │ │ ├── contact │ │ │ ├── components │ │ │ │ ├── form │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ ├── icon │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ └── page │ │ │ │ ├── index.js │ │ │ │ └── style.module.css │ │ │ ├── services │ │ │ │ └── contact.service.js │ │ │ └── __tests__ │ │ ├── events │ │ │ ├── components │ │ │ │ ├── ApplyButton │ │ │ │ │ ├── ApplyButton.js │ │ │ │ │ └── style.module.css │ │ │ │ ├── eventCard │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ ├── EventDetails │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ ├── eventsListPage │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ ├── eventsSection │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ ├── Gallery │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ ├── PopupContent │ │ │ │ │ ├── PopupContent.js │ │ │ │ │ └── style.module.css │ │ │ │ └── singleEventPage │ │ │ │ ├── index.js │ │ │ │ └── style.module.css │ │ │ ├── services │ │ │ │ └── events.service.js │ │ │ └── __tests__ │ │ ├── static-pages │ │ │ ├── about │ │ │ │ └── components │ │ │ │ ├── page │ │ │ │ │ ├── components │ │ │ │ │ │ ├── header │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── style.module.css │ │ │ │ │ │ ├── sectionName │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── style.module.css │ │ │ │ │ │ ├── sectionName │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── style.module.css │ │ │ │ │ │ └── structureSection │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── style.module.css │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ ├── section │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ └── video │ │ │ │ └── index.js │ │ │ └── home │ │ │ ├── components │ │ │ │ ├── bestProjects │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ ├── intro │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.module.css │ │ │ │ └── page │ │ │ │ ├── index.js │ │ │ │ └── style.module.css │ │ │ ├── services │ │ │ │ └── clients.service.js │ │ │ └── __tests__ │ │ └── teamServices │ │ ├── components │ │ │ ├── singleServicePage │ │ │ │ ├── index.js │ │ │ │ └── style.module.css │ │ │ └── teamServicesSection │ │ │ ├── index.js │ │ │ └── style.module.css │ │ ├── store │ │ │ └── services.json │ │ └── __tests__ │ │ ├── singleServiceSection.test.js │ │ └── __snapshots__ │ ├── serviceWorker.js │ ├── shared │ │ ├── footer │ │ │ ├── index.js │ │ │ └── style.module.css │ │ ├── header │ │ │ ├── index.js │ │ │ └── style.css │ │ ├── Image-loader │ │ │ ├── index.js │ │ │ └── style.css │ │ ├── Input.js │ │ ├── layout │ │ │ ├── index.js │ │ │ └── style.css │ │ ├── lazy-image │ │ │ └── index.js │ │ ├── loading │ │ │ └── index.js │ │ ├── newsletterForm │ │ │ ├── index.js │ │ │ └── style.module.css │ │ ├── notFoundPage │ │ │ ├── index.js │ │ │ └── style.module.css │ │ ├── services │ │ │ ├── date.service.js │ │ │ ├── image.service.js │ │ │ ├── language.service.js │ │ │ ├── newsletter.service.js │ │ │ └── validation.service.js │ │ ├── sideDrawer │ │ │ ├── index.js │ │ │ └── style.module.css │ │ ├── __tests__ │ │ │ ├── footer.test.js │ │ │ ├── header.test.js │ │ │ ├── newsLetter.test.js │ │ │ ├── sideDrawer.test.js │ │ │ └── themeBtn.test.js │ │ └── theme-button │ │ ├── index.js │ │ └── style.css │ └── styles.css وهذا مثال على تخطيط وتنظيم لمشروع متوسط نوعا ويتيح لك الإمكانية للتوسع في المستقبل دون معاناه ودون إستهلاك الكثير من الوقت حيث أن المشروع مقسم وحدات وكل وحدة منعزلة بمفردها حتى في حالة أردت إستخدام وحدة كاملة في مشروع أخر فيمكنك فقط نسخ الفولدر الخاص بها كاملا ونقله الى المشروع الذي تريد دون أي معاناة تذكر.2 نقاط
-
هذا الكود يعرض الرسائل من قاعدة البيانات للرسائل الواردة للعضو - لكنه يعرض اقدم رسالة للعضو كيف يمكن عرض احدث رسالة بدلا من اقدم رسالة <?php $stmt = $db->prepare('select * FROM messages WHERE recipient_id = ? GROUP BY sender_id ORDER BY id DESC'); $stmt->bind_param('i', $_SESSION['id']); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ; } $stmt->close(); ?>1 نقطة
-
في حال قمت بإيقاف موقعك فلا يمكنك تنفيذ أي إجراء آخر، فالذي يحصل تحديداً عند إيقاف الموقع هو إضافة ملف باسم down ضمن المسار: storage/framework. وبالتالي عند تنفيذ الأمر: php artisan up يتم إزالة الملف السابق ويعود الموقع للعمل من جديد. يمكنك بشكل مماثل إنشاء وحذف الملف في المسار التالي بشكل غير مباشر: storage/framework وعند الحاجة لإعادة تشغيل الموقع فقط قم بحذف هذا الملف من جديد. ومن الطرق الأخرى هو إنشاء عنوان IP كاستثناء أثناء إيقاف الموقع، بحيث يبقى باستطاعتك زيارة الموقع وتنفيذ الأوامر: php artisan down --allow=127.0.0.1 --allow=192.168.0.0/16 وفي نسخة لارافيل 8، تم إضافة الخاصية secret بحيث يمكنك تمرير token حتى ولو كان الموقع بحالة maintenance: php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515" وعندها يمكنك زيارة الموقع عن طريق رابط مماثل للتالي: https://example.com/1630542a-246b-4b66-afa1-dd72a4c435151 نقطة
-
من خلال Laravel يمكنك الحصول على جميع المدخلات من خلال الدالة: Input::all(); ويمكنك إعادة التوجيه إلى الصفحة السابقة وتمرير القيم عن طريق: return Redirect::back()->withInput($values); فما علينا فعله هو إعادة التوجيه مع تمرير القيم التي حصلنا عليها كالآتي: return Redirect::back()->withInput(Input::all());1 نقطة
-
يمكنك حذف إشارة التعليق في الملف التالي RouteServiceProvider.php الذي يوجد في المسار التالي app\Providers عن متغير //protected $namespace = 'App\\Http\\Controllers'; ليصبح protected $namespace = 'App\\Http\\Controllers'; ومن ثم التجربة مرة أخرى.1 نقطة
-
في الإصدار الجديد من Laravel - 8 لا يتم تطبيق namespace للوصول إلى المتحكم بشكل مباشر, بل يجب استدعاؤه عن طريق كتابة المسار كاملًا, كالآتي: Route::get('register', 'App\Http\Controllers\RegisterController@register'); أو أن تقوم بإضافة namespace يدويًا وذلك بإضافة مسار الكلاس في ملف الموجهات كالآتي: use App\Http\Controllers\RegisterController; Route::get('/register', [RegisterController::class, 'register']);1 نقطة
-
في جملة SQL يبدو أنه يتم ترتريب الرسائل من خلال العمود id، بدلًا من ذلك يجب أن يكون الترتيب بناءًا على الوقت (أي من خلال العمود date) <?php $stmt = $db->prepare('select * FROM messages WHERE recipient_id = ? GROUP BY sender_id ORDER BY date DESC'); $stmt->bind_param('i', $_SESSION['id']); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ; } $stmt->close(); كما يمكنك أن تقوم بعكس ترتيب الرسائل تنازليًا أو تصاعديًا من خلال التبديل بين (DESC - ASC) في نهاية جملة SQL بالتوفيق.1 نقطة
-
بعكس ما يظنه البعض نعم تخزين token في localStorage غير آمن حتى وإن كنت تستخدم ReactJS، إذاً أين أخزنها ﻷن السيرفر يحتاجها؟ قل لجماعة السيرفر أن يخزنوها بالـCookies وليجعلوها Http-Only أي لا يمكن قراءتها من الجافاسكريبت ولينسوا ذاك Authorization Header ﻷنه يجبر مبرمج frontend على استخدام طرق غير آمنة لتخزين token. وﻷن Cookie لا يمكن قراءتها بالجافاسكريبت لذلك خزن في localStorage عند تسجيل الدخول الناجح متحول بولياني وضعه على true، هذا فقط من أجل واجهة المستخدم حتى لا يضطر المستخدم لتسجيل الدخول مع كل request وليس للأمان واﻷمان يتحقق منه السيرفر من خلال التحقق من Cookies المرسلة مع request. لا تقلق بشأن الـAJAX requests التي تقوم بها ﻷن Cookies ترسل بشكل تلقائي مع request ولا داعي ﻷن تقوم بذلك بنفسك إلا إذا كنت ترسل cross-domain request حينها كل ما عليك هو تمرير withCredentials: true ضمن request config لمكتبة axios مثال: axios.get('https://domaindifferentfromours.com', { withCredentials: true }); بالطبع ما قلته هو الحل المثالي ولكن الواقع قد يفرض عليك تخزين JWT Token ضمن localStorage وهذا هو الحال عند استخدام third-party API مثلاً حيث لا يمكنك التحكم بالسيرفر.1 نقطة
-
يمكنك إزالة reCaptcha عن طريق Enabling the Android Device Verification API في مشروعك على google cloud console من Google. يمكنك القيام بذلك عن طريق إضافة مشروعك هناك ثم يجب عليك أيضًا إضافة مفتاح SHA-256 في مشروع Firebase الخاص بك في إعداد المشروع.1 نقطة
-
1 نقطة
-
نلاحظ أن الاستعلام يعمل وفق شرط بتحديد من هو المرسل و من هو المستقبل. recipient_id = ? AND sender_id = ? لجلب الرسائل بالاتجاهين يمكننا وضع شرط or و تعديل الاستعلام. يمكن أن نضع or ثم نفس الشرط و نبدل بين قيم id لهما. $Sid = $_SESSION['id'] $Gid = $_GET['to'] WHERE recipient_id = ? AND sender_id =? OR recipient_id = ? AND sender_id =? Sid , Gid , Gid , Sid1 نقطة
-
قبل البداية في الرد على السؤال لديك خطأ بسيط في كتابة أسماء الدوال التاليه عند إستدعائها داخل الداله handleClick وهما setfirstState و setsecondState والصحيح setFirstState و setSecondState ننتقل الى لب السؤال بكل بساطة لدينا حالتين نقوم بعمل تحديث لل state فيها الحالة الأولى: إذا كنا داخل عملية غير تزامنيه (asynchronously) ففي هذه الحاله لا يتم عمل batching بل لكل تحديث لل State سوف يتم عملية render كامله كما هو الحال في الكود الخاص بك المرفق في السؤال. الحالة الثانية: في حالة قمنا بتحديث ال state مباشرة ودون التواجد داخل أي عملية غير تزامنيه فهنا يتم تنفيذ ال batching وتتم عملية ال render مرة واحدة فقط ويمكننا تعديل الكود الخاص بك قليلا كمثال على ذلك كالتالي function Component() { const [firstState, setFirstState] = useState('first'); const [secondState, setSecondState] = useState('second'); function handleClick() { setfirstState('First State Changed'); setsecondState('Second State Changed'); } return ( <button onClick={handleClick}> {firstState} <br /> {secondState} </button> ) } بالتوفيق إن شاء الله.1 نقطة
-
الأمر بسيط جدا دعنا نأخذ خطوة الى الوراء ونسئل ماهو ال Redirect ؟ بكل بساطه هو مكون موجود في ريأكت روتر من خلاله يمكنك تحويل المستخدم الى مسار أخر حسنا ولكي تقوم ريأكت بعرض مكون لابد من أن تقوم بعملية render ومن ضمن الأمور التي تجبر ريأكت على عملية الريندر أن يتم تغير ال state. جميل حتى هنا الامور بسيطه لذا فلكي تقوم ريأكت بالإستجابة إلى ما أخبرها به وتحويل المستخدم إلى مسار أخر لابد من أن تيم تحديث ال state بقيمة أريدها وعليها يتم التحويل فيكننا بكل بساطة بإستخدام الكود التالي import React, { PropTypes } from 'react'; import { Redirect } from 'react-router' import axios from 'axios'; import AppForm from '../../components/Form'; class FormPage extends React.Component { constructor(props) { super(props); this.state = { redirect: false, // التعديل رقم 1 errors: {}, user: { username: '', email: '', password: '', confirmPassword: '' } }; this.handleForm = this.processForm.bind(this); this.changeUser = this.changeUser.bind(this); } changeUser(event) { const target = event.target; const field = target.name; const user = this.state.user; user[field] = target.value; this.setState({ user.field: field }); } async handleForm(event) { event.preventDefault(); const username = this.state.user.username; const email = this.state.user.email; const password = this.state.user.password; const confirmPassword = this.state.user.confirmPassword; const formData = { username, email, password, confirmPassword }; axios.post('/register', formData, { headers: {'Accept': 'application/json'} }) .then((response) => { this.setState({ errors: {}, redirect: true, // التعديل رقم 2 }); }).catch((error) => { const errors = error.response.data.errors ? error.response.data.errors : {}; errors.summary = error.response.data.message; this.setState({ errors }); }); } render() { if(this.state.redirect) return <Redirect to="" /> // التعديل رقم 3 return ( <> <div> <AppForm onSubmit={this.handleForm} onChange={this.changeUser} errors={this.state.errors} user={this.state.user} /> </div> </> ); } } export default FormPage; قمنا هنا ب ثلاثة تعديلات بسيطه التعديل رقم 1: قمنا بإضافة خاصية جديده داخل ال state تسمى ب redirect وقيمتها ب false التعديل رقم 2: في الكود الذي تعدل فيه قيمة ال State حدثنا أيضا قيمة ال redirect التعديل رقم 3: بما أننا حدثنا ال state ف ريأكت سوف تقوم بالبحث داخل الداله render وترى هل نعتمد على القيم التي تم تغيرها في ال state لعرض مكون معين؟ إذا كانت الإجابه بنعم فتقوم بتنفيذ ال render مرة أخرى وبالتالي سوف يتحقق الشرط المكتول لتنفيذ عملية ال redirect ويتم عرض مكون Redirect الذي بدوره يقوم بتحويل المستخدم إلى المسار الذي تريد.1 نقطة
-
لا يمكننا استخدام ال redirect في ال function كما فعلت لأنها كائن أو component وجب أن تستعمل ك component ولذلك نحتاج في هذا الموقف أن نستخدم ال hook ال useHistory أو ال history.push بما أنك تستخدم الإصدار الأخير كالتالي import { useHistory } from "react-router-dom"; //في الأعلى hook يجبإستدعاء هذا ال async handleForm(event) { event.preventDefault(); const username = this.state.user.username; const email = this.state.user.email; const password = this.state.user.password; const confirmPassword = this.state.user.confirmPassword; const formData = { username, email, password, confirmPassword }; axios.post('/register', formData, { headers: {'Accept': 'application/json'} }) .then((response) => { this.setState({ errors: {} }); // <Redirect to="/" /> بدلاً من ذلك //let history = useHistory(); history.push('/')functional component إذا كنت تستخدم this.props.history.push('/'); }).catch((error) => { const errors = error.response.data.errors ? error.response.data.errors : {}; errors.summary = error.response.data.message; this.setState({ errors }); }); }1 نقطة
-
نعم قمت بالتجربة <?php $stmt = $db->prepare('select * FROM messages WHERE recipient_id = ? GROUP BY sender_id ORDER BY id DESC'); $stmt->bind_param('i', $_SESSION['id']); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ; } $stmt->close(); ?> اما عن مشكلة عرض المحادثة بين العضوين فسوف اطرحة فى موضوع منفصل شكرا لكم1 نقطة
-
1 نقطة
-
نعم يمكننا عمل هذا حيث يتطلب عنصر div: HTML و بعض التنسيقات: HTML: <div id="parallelogram"></div> + CSS: #parallelogram{ width: 160px; height: 100px; background: #8734f7; -webkit-transform: skew(30deg); -moz-transform: skew(30deg); -o-transform: skew(30deg); transform: skew(30deg); } والشكل: عليك التلاعب بمواقع العناصر من خلال الخاصية position و تموضع العناصر فوق بعضهم عن طريق z-index1 نقطة
-
لعمل مثل هذا الموقع يجب أن يتوفر عدد من الأشخاص (أو شخص واحد لديه كل المهارات المطلوبة) وهم كالتالي: مصمم واجهات UI/UX Designer: سيقوم هذا الشخص برسم شكل الموقع بكل صفحاته ليقوم مطور بتحويل هذه التصميمات إلى كود يعمل في المتصفح (ينشئ الموقع) مطور مواقع front end : وهو الشخص الذي سيقوم بتحويل التصميم إلى كود كما وضحت سابقا. مطور backend: وهو المسؤول عن عمل آلية الموقع، مثل عمل وإدارة قاعدة البيانات، إنشاء آلية تسجيل الدخول للمستخدمين، معالجة الأخطاء على السيرفر ... إلخ. ولكل إختصاص من الإختصاصات السابقة يوجد مجموعة واسعة من التقنيات التي يمكن إستخدامها، فعلى سبيل المثال: يمكن أن يستعمل مصمم الواجهات برنامج Adobe أكس دي أو Figma، ويمكن لمطور front end أن يستعمل مكتبات مثل bootstrap أو tailwind csa أو bulma إلخ ويمكنه أيضاً أن يستعمل إطار جافا سكريبت مثل vue.js أو React.js، وفي النهاية يستطيع مطور backend أن يستعمل أحد لغات البرمجة لعمل جزء ال backend الخاص بالموقع، ولكل لغة برمجة إطارات عمل متعددة، مثلا لغة PHP لها إطار عمل Laravel، ولغة python لها flask أو Django ولغة javascript لها express.js وغيرهم الكثير. أنصحكِ بنشر مشروع على أحد مواقع العمل الحر (مثل مستقل) وأطلبي فيه عمل مثل هذا الموقع، وسيقدم العديد من المطورين عروضهم وعليك مناقشة المناسبين منهم قبل بدء العمل مع أحد منهم لمعرفة كل التفاصيل. بالتوفيق.1 نقطة
-
خطوات بسيطه وسهله بإذن الله 1- قم بإنشاء مشروع ريأكت باستخدام create-react-app 2- قم بتثبيت tailwind npm install -D tailwindcss@npm:@tailwindcss/postcss7-compat @tailwindcss/postcss7-compat postcss@^7 autoprefixer@^9 3- قم بتثبيت CRACO من خلاله يمكنك التعديل على الاعدادات الخاصه ب PostCSS npm install @craco/craco 4- بعد تثبيت CRACO قم بالتوجه الى فايل package.json و عدل الجزء الخاص بال scripts حتى يكون كالتالي: "scripts": { "start": "craco start", "build": "craco build", "test": "craco test", "eject": "react-scripts eject" } 5- بعد ذلك في المسار الرئيسي (root path) لمشروعك قم بإنشاء فايل بإسم craco.config.js وأضف إليه الكود التالي: module.exports = { style: { postcss: { plugins: [ require('tailwindcss'), require('autoprefixer'), ], }, }, } 6- قم بتشغيل الامر التالي لانشاء الملف المسئول عن إعدادات tailwind npx tailwindcss init 7- بعد تشغيل الامر السابق قم بفتح الملف tailwind.config.js وعدل قيمة ال purge الى التالي: purge: ['./src/**/*.{js,jsx,ts,tsx}', './public/index.html'], 8- بعد ذلك قم بفتح ملف index.css الموجود داخل فولدر src الذي يتم إنشاءه تلقائيا باستخدام create-react-app وأضف إليه الكود التالي: @tailwind base; @tailwind components; @tailwind utilities; 9- الخطوة الأخيره تأكد من عمل import لملف index.css داخل ملف ال index.js الموجود أيضا داخل فولدر src والذي يتم إنشاءه تلقائيا أيضا import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; // هذا الملف الذي عدلناه مسبقا import App from './App'; import reportWebVitals from './reportWebVitals'; ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode>, document.getElementById('root') ); وبهذا يمكنك إستخدام tailwind مع React وإذا أردت إنشاء ملفات css دون إستخدام tailwind لبعض التخصيص الغير متاح في tailwind يمكنك إنشاء الملف بطريقة عاديه ومن ثم عمل import له في ملف ال index.css بعد ال @tailwind utilites1 نقطة
-
يمكنك البحث على الإنترنت حيث توجد العديد من المواقع التي تقدم أكوادًا لألعاب مكتوبة بلغة بايثون، من ضمن هذه المواقع: موقع pygame وهو الموقع الرسمي لمكتبة صناعة الألعاب pygame إن كنتِ تريدين ألعاب كتبت بلغة بايثون بدون إستخدام أي مكتبات يمكنكِ أن تلقي نظرة على هذا المستدوع على GitHub فهو يحتوي على 25 لعبة مختلفة. يحتوي هذا المستدوع أيضًا على عدد من الألعاب المختلفة مصنوعة بلغة بايثون. بالتوفيق، تحياتي.1 نقطة
-
قم بتعيين الخيارات الخاصة بالصورة كالآتي: $pdf->Image($image_path, 50 , 10 , 100 , 20 , '', null, 'center'); ^^ ^^ ^^^ ^^ X Y W H بحيث أنّ X: أحداثيات الصورة (يمين - يسار) Y: أحداثيات الصورة (أعلى - أسفل) W: مقاس الصورة بالعرض H: مقاس الصورة بالطول1 نقطة
-
يمكنك استخدام التالي $this->Image($image_file, 90, 5, 40, '', 'PNG', '', 'T', false, 300, 'C', false, false, 0, false, false, false); بحيث: L - لليسار. C - للمنتصف. R - لليمين. إذا كانت فارغة تتجه الصورة مع اتجاه الصفحة سواء ltr - rtl. أو يمكنك تجربة التالي <?php require ('TCPDF.php'); class PDF extends TCPDF { const DPI = 96; const MM_IN_INCH = 25.4; const A4_HEIGHT = 297; const A4_WIDTH = 210; const MAX_WIDTH = 800; const MAX_HEIGHT = 500; function pixelsToMM($val) { return $val * self::MM_IN_INCH / self::DPI; } function resizeToFit($imgFilename) { list($width, $height) = getimagesize($imgFilename); $widthScale = self::MAX_WIDTH / $width; $heightScale = self::MAX_HEIGHT / $height; $scale = min($widthScale, $heightScale); return array( round($this->pixelsToMM($scale * $width)), round($this->pixelsToMM($scale * $height)) ); } function centreImage($img) { list($width, $height) = $this->resizeToFit($img); $this->Image( $img, (self::A4_HEIGHT - $width) / 2, (self::A4_WIDTH - $height) / 2, $width, $height ); } } $pdf = new PDF(); $pdf->AddPage("L"); $pdf->centreImage("path/to/my/image.jpg"); $pdf->Output(); ?>1 نقطة
-
1 نقطة
-
يوجد العديد من المنصات التي تقدم شروحات برمجة باللغة العربية ومنها أكاديمية حسوب. إن تعلمك للغة الانكليزية ليس ضروري بدرجة كبيرة إنما خلال البرمجة نتعامل مع بعض المصطلحات الانكليزية مثلما هي لصعوبة ترجمتها و تبديل المصطلحات و إيجاد بديل لها مفهوم من قبل الجميع حيث أن توحيد المفاهيم يسهل النقاشات البرمجية و تبادل الأفكار. إن أغلب حلول المشكلات التي تعترض خلال الدراسة والعمل (في حال عدم وجود مرشدين و مدربين معك) ستحتاج للبحث عنها في غوغل و قراءة شروحات أجنبية وهنا تكمن الصعوبة بالإضافة للتوثيقات و الشروحات لجميع التقنيات هي بالانكليزية و لن تنفع ترجمة غوغل لتعريبها و فهمها، فبما أن لغتك ضعيفة إما أن تحسنها أو تتعلم من مصادر عربية.1 نقطة
-
مرحبا, هل ممكن ترفع المجلد كامل بدون نقص لاي ملف مع التنسيقات ؟1 نقطة
-
أهلا بكي ماريا, يمكنك البحث من خلال المتصفح عن موقع mutaz ثم الذهاب إلى أول رابط ستجدين العديد من البرامج هناك منها البرنامج الذي تبحثين عنه.1 نقطة