ساخت صفحه کلید روبات تلگرام با مقادیر نامشخص

حل شده 

PHP

توسط telebot در 2 سال پیش
2 23.4k 11 2 سال پیش
telebot reza
1

سلام.من یه روبات ساختم و میخوام کلید های صفحه کلید روبات که تعداد کلید ها متغیره رو از دیتابیس بخونم و صفحه کلید رو ایجاد کنم.چون تعداد کلید ها نامشخصه چطوری تعریف کنم که مثلا هر دو تا کلید رو داخل یه سطر قرار بگیره.الان همه کلید ها داخل یه سطر قرار میگیرن که خوانا نیست میخوام هر دو یا سه کلید رو داخل یه سطر قرار بدم.چیکار کنم؟از فریم ورک TelegramBotPHP برای اینکار استفاده کردم
کد زیر نمونه صفحه کلید خود فریم ورک هست منتها با تعداد کلیدهای مشخص

$option = array( 
    //First row
    array($telegram->buildInlineKeyBoardButton("Button 1", $url="http://link1.com"), $telegram->buildInlineKeyBoardButton("Button 2", $url="http://link2.com")), 
    //Second row 
    array($telegram->buildInlineKeyBoardButton("Button 3", $url="http://link3.com"), $telegram->buildInlineKeyBoardButton("Button 4", $url="http://link4.com"), $telegram->buildInlineKeyBoardButton("Button 5", $url="http://link5.com")), 
    //Third row
    array($telegram->buildInlineKeyBoardButton("Button 6", $url="http://link6.com")) );
$keyb = $telegram->buildInlineKeyBoard($option);
$content = array('chat_id' => $chat_id, 'reply_markup' => $keyb, 'text' => "This is a Keyboard Test");
$telegram->sendMessage($content);
آخرین ویرایش: 03-04-2018 ساعت 09:34، توسط Reza دلیل: لطفا کد رو تو بلاک code بذارید

پاسخ ها

0

کدها رو باید در تگ code ( علامت </> در ادیتور) قرار بدید تا قابل خوندن باشه. لطفا راهنما رو بخونید.


از کد SQL که گذاشتین اینطور برداشت میشه که میخواین هر کشور در یک ردیف نمایش داده بشه. میتونید با استفاده از یه شمارنده تعداد ردیف ها و ستون ها رو درست کنید. یه نمونه:

// dummy data imagine fetched from your database
$countries = array('iran','USA','canada','UK','france','italy','germany','more...');

// how many buttons should be displayed in a row
$button_cols = 3;

$button_row = array();
$option = array();
$row_counter = 0;

// build the buttons and append to $options
foreach ($countries as $country) {

	$button_row []= $telegram->buildKeyboardButton($country);

	$option[$row_counter] = $button_row;

	// we reach cols limit, go next row
	if(count($button_row) >= $button_cols){
		$row_counter++;
		$button_row = array();
	}

}

خروجی:

array (size=3)
  0 => 
    array (size=3)
      0 => 
        array (size=3)
          'text' => string 'iran' (length=4)
          'request_contact' => boolean false
          'request_location' => boolean false
      1 => 
        array (size=3)
          'text' => string 'USA' (length=3)
          'request_contact' => boolean false
          'request_location' => boolean false
      2 => 
        array (size=3)
          'text' => string 'canada' (length=6)
          'request_contact' => boolean false
          'request_location' => boolean false
  1 => 
    array (size=3)
      0 => 
        array (size=3)
          'text' => string 'UK' (length=2)
          'request_contact' => boolean false
          'request_location' => boolean false
      1 => 
        array (size=3)
          'text' => string 'france' (length=6)
          'request_contact' => boolean false
          'request_location' => boolean false
      2 => 
        array (size=3)
          'text' => string 'italy' (length=5)
          'request_contact' => boolean false
          'request_location' => boolean false
  2 => 
    array (size=2)
      0 => 
        array (size=3)
          'text' => string 'germany' (length=7)
          'request_contact' => boolean false
          'request_location' => boolean false
      1 => 
        array (size=3)
          'text' => string 'more...' (length=7)
          'request_contact' => boolean false
          'request_location' => boolean false
0

سلام
بستگی داره از چه روشی استفاده کرده باشید. شما ساختار و نحوه ساخت کلید چند ردیفه رو که میدونید(کد بالا) فقط کافیه با توابع دستکاری آرایه ها چیزی که میخواین رو درست کنید.

0
$option = array( 
			array($telegram->buildKeyboardButton("ایران"),$telegram->buildKeyboardButton("استرالیا")),
			array($telegram->buildKeyboardButton("امریکا"),$telegram->buildKeyboardButton("کانادا")),
			...
			array($telegram->buildKeyboardButton("فرانسه"),$telegram->buildKeyboardButton("انگلستان"))
			);

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

$res = $db->query("select name from country");
		$row = $res->fetchAll(PDO::FETCH_ASSOC);
		// var_dump($row);
		foreach ($row as $row)

از array_push($option,$row['name']); میشه مقادیر رو به ارایه فرستاد ولی طبیعتا درست نیست و باید با فرمت قابل قبول فریم ورک باشه که نمیدونم چطوری داخل ارایه قرار بدم

آخرین ویرایش: 03-04-2018 ساعت 18:15، توسط Reza
0

تشکر فراوان
حل شد

0

فقط یه نکته:میشه ارایه کلید ها رو بصورت زیر در نظر گرفت که عنوان دکمه های صفحه کلید رو مقادیر بهش بدم ولی کلید های ارایه رو داخل دیتابیس ذخیره کنم.
مثلا عنوان دکمه iran باشه ولی مقدار ir پاس داده بشه به برنامه.اینکار شدنیه؟کلا میشه واسه هر کلید از صفحه کلید پارامترهای دیگه هم در نظر گرفت که ازش استفاده کنیم؟

$countries = array('ir'=>'iran','us'=>'USA','ca'=>'canada');
آخرین ویرایش: 03-04-2018 ساعت 23:41، توسط telebot
0

نحوه اضافه کردن key به ارایه رو یاد دارم ولی فریم ورک TelegramBotPHP مقدار key و value رو جداگانه دریافت نمیکنه و فقط عنوان دکمه کلیک شده یا همون value رو دریافت میکنه

0

اون تابع که فقط برای نمایش label دکمه هست. شما فقط کافیه مقادیر رو از foreach بگیرید و پاس بدید به متد.

0

ببخشید متوجه نشدم میشه با یه مثال توضیح بدید دقیقا یعنی چی

0

شما میخواین کد کشور رو فقط تو دیتابیش داشته باشید دیگه درسته؟ یعنی بعد از فراخوانی مثلا کد IR باید تو دکمه Iran نوشته بشه.
برای اینکار یه تابع میخواین که کد رو به نام کشور تبدیل کنه:

function code_to_country($code)
{

    $code = strtoupper($code);

    $countryList = array(
        'AF' => 'Afghanistan',
        'AX' => 'Aland Islands',
        'AL' => 'Albania',
        'DZ' => 'Algeria',
        'AS' => 'American Samoa',
        'AD' => 'Andorra',
        'AO' => 'Angola',
        'AI' => 'Anguilla',
        'AQ' => 'Antarctica',
        'AG' => 'Antigua and Barbuda',
        'AR' => 'Argentina',
        'AM' => 'Armenia',
        'AW' => 'Aruba',
        'AU' => 'Australia',
        'AT' => 'Austria',
        'AZ' => 'Azerbaijan',
        'BS' => 'Bahamas the',
        'BH' => 'Bahrain',
        'BD' => 'Bangladesh',
        'BB' => 'Barbados',
        'BY' => 'Belarus',
        'BE' => 'Belgium',
        'BZ' => 'Belize',
        'BJ' => 'Benin',
        'BM' => 'Bermuda',
        'BT' => 'Bhutan',
        'BO' => 'Bolivia',
        'BA' => 'Bosnia and Herzegovina',
        'BW' => 'Botswana',
        'BV' => 'Bouvet Island (Bouvetoya)',
        'BR' => 'Brazil',
        'IO' => 'British Indian Ocean Territory (Chagos Archipelago)',
        'VG' => 'British Virgin Islands',
        'BN' => 'Brunei Darussalam',
        'BG' => 'Bulgaria',
        'BF' => 'Burkina Faso',
        'BI' => 'Burundi',
        'KH' => 'Cambodia',
        'CM' => 'Cameroon',
        'CA' => 'Canada',
        'CV' => 'Cape Verde',
        'KY' => 'Cayman Islands',
        'CF' => 'Central African Republic',
        'TD' => 'Chad',
        'CL' => 'Chile',
        'CN' => 'China',
        'CX' => 'Christmas Island',
        'CC' => 'Cocos (Keeling) Islands',
        'CO' => 'Colombia',
        'KM' => 'Comoros the',
        'CD' => 'Congo',
        'CG' => 'Congo the',
        'CK' => 'Cook Islands',
        'CR' => 'Costa Rica',
        'CI' => 'Cote d\'Ivoire',
        'HR' => 'Croatia',
        'CU' => 'Cuba',
        'CY' => 'Cyprus',
        'CZ' => 'Czech Republic',
        'DK' => 'Denmark',
        'DJ' => 'Djibouti',
        'DM' => 'Dominica',
        'DO' => 'Dominican Republic',
        'EC' => 'Ecuador',
        'EG' => 'Egypt',
        'SV' => 'El Salvador',
        'GQ' => 'Equatorial Guinea',
        'ER' => 'Eritrea',
        'EE' => 'Estonia',
        'ET' => 'Ethiopia',
        'FO' => 'Faroe Islands',
        'FK' => 'Falkland Islands (Malvinas)',
        'FJ' => 'Fiji the Fiji Islands',
        'FI' => 'Finland',
        'FR' => 'France, French Republic',
        'GF' => 'French Guiana',
        'PF' => 'French Polynesia',
        'TF' => 'French Southern Territories',
        'GA' => 'Gabon',
        'GM' => 'Gambia the',
        'GE' => 'Georgia',
        'DE' => 'Germany',
        'GH' => 'Ghana',
        'GI' => 'Gibraltar',
        'GR' => 'Greece',
        'GL' => 'Greenland',
        'GD' => 'Grenada',
        'GP' => 'Guadeloupe',
        'GU' => 'Guam',
        'GT' => 'Guatemala',
        'GG' => 'Guernsey',
        'GN' => 'Guinea',
        'GW' => 'Guinea-Bissau',
        'GY' => 'Guyana',
        'HT' => 'Haiti',
        'HM' => 'Heard Island and McDonald Islands',
        'VA' => 'Holy See (Vatican City State)',
        'HN' => 'Honduras',
        'HK' => 'Hong Kong',
        'HU' => 'Hungary',
        'IS' => 'Iceland',
        'IN' => 'India',
        'ID' => 'Indonesia',
        'IR' => 'Iran',
        'IQ' => 'Iraq',
        'IE' => 'Ireland',
        'IM' => 'Isle of Man',
        'IL' => 'Israel',
        'IT' => 'Italy',
        'JM' => 'Jamaica',
        'JP' => 'Japan',
        'JE' => 'Jersey',
        'JO' => 'Jordan',
        'KZ' => 'Kazakhstan',
        'KE' => 'Kenya',
        'KI' => 'Kiribati',
        'KP' => 'Korea',
        'KR' => 'Korea',
        'KW' => 'Kuwait',
        'KG' => 'Kyrgyz Republic',
        'LA' => 'Lao',
        'LV' => 'Latvia',
        'LB' => 'Lebanon',
        'LS' => 'Lesotho',
        'LR' => 'Liberia',
        'LY' => 'Libyan Arab Jamahiriya',
        'LI' => 'Liechtenstein',
        'LT' => 'Lithuania',
        'LU' => 'Luxembourg',
        'MO' => 'Macao',
        'MK' => 'Macedonia',
        'MG' => 'Madagascar',
        'MW' => 'Malawi',
        'MY' => 'Malaysia',
        'MV' => 'Maldives',
        'ML' => 'Mali',
        'MT' => 'Malta',
        'MH' => 'Marshall Islands',
        'MQ' => 'Martinique',
        'MR' => 'Mauritania',
        'MU' => 'Mauritius',
        'YT' => 'Mayotte',
        'MX' => 'Mexico',
        'FM' => 'Micronesia',
        'MD' => 'Moldova',
        'MC' => 'Monaco',
        'MN' => 'Mongolia',
        'ME' => 'Montenegro',
        'MS' => 'Montserrat',
        'MA' => 'Morocco',
        'MZ' => 'Mozambique',
        'MM' => 'Myanmar',
        'NA' => 'Namibia',
        'NR' => 'Nauru',
        'NP' => 'Nepal',
        'AN' => 'Netherlands Antilles',
        'NL' => 'Netherlands the',
        'NC' => 'New Caledonia',
        'NZ' => 'New Zealand',
        'NI' => 'Nicaragua',
        'NE' => 'Niger',
        'NG' => 'Nigeria',
        'NU' => 'Niue',
        'NF' => 'Norfolk Island',
        'MP' => 'Northern Mariana Islands',
        'NO' => 'Norway',
        'OM' => 'Oman',
        'PK' => 'Pakistan',
        'PW' => 'Palau',
        'PS' => 'Palestinian Territory',
        'PA' => 'Panama',
        'PG' => 'Papua New Guinea',
        'PY' => 'Paraguay',
        'PE' => 'Peru',
        'PH' => 'Philippines',
        'PN' => 'Pitcairn Islands',
        'PL' => 'Poland',
        'PT' => 'Portugal, Portuguese Republic',
        'PR' => 'Puerto Rico',
        'QA' => 'Qatar',
        'RE' => 'Reunion',
        'RO' => 'Romania',
        'RU' => 'Russian Federation',
        'RW' => 'Rwanda',
        'BL' => 'Saint Barthelemy',
        'SH' => 'Saint Helena',
        'KN' => 'Saint Kitts and Nevis',
        'LC' => 'Saint Lucia',
        'MF' => 'Saint Martin',
        'PM' => 'Saint Pierre and Miquelon',
        'VC' => 'Saint Vincent and the Grenadines',
        'WS' => 'Samoa',
        'SM' => 'San Marino',
        'ST' => 'Sao Tome and Principe',
        'SA' => 'Saudi Arabia',
        'SN' => 'Senegal',
        'RS' => 'Serbia',
        'SC' => 'Seychelles',
        'SL' => 'Sierra Leone',
        'SG' => 'Singapore',
        'SK' => 'Slovakia (Slovak Republic)',
        'SI' => 'Slovenia',
        'SB' => 'Solomon Islands',
        'SO' => 'Somalia, Somali Republic',
        'ZA' => 'South Africa',
        'GS' => 'South Georgia and the South Sandwich Islands',
        'ES' => 'Spain',
        'LK' => 'Sri Lanka',
        'SD' => 'Sudan',
        'SR' => 'Suriname',
        'SJ' => 'Svalbard & Jan Mayen Islands',
        'SZ' => 'Swaziland',
        'SE' => 'Sweden',
        'CH' => 'Switzerland, Swiss Confederation',
        'SY' => 'Syrian Arab Republic',
        'TW' => 'Taiwan',
        'TJ' => 'Tajikistan',
        'TZ' => 'Tanzania',
        'TH' => 'Thailand',
        'TL' => 'Timor-Leste',
        'TG' => 'Togo',
        'TK' => 'Tokelau',
        'TO' => 'Tonga',
        'TT' => 'Trinidad and Tobago',
        'TN' => 'Tunisia',
        'TR' => 'Turkey',
        'TM' => 'Turkmenistan',
        'TC' => 'Turks and Caicos Islands',
        'TV' => 'Tuvalu',
        'UG' => 'Uganda',
        'UA' => 'Ukraine',
        'AE' => 'United Arab Emirates',
        'GB' => 'United Kingdom',
        'US' => 'United States of America',
        'UM' => 'United States Minor Outlying Islands',
        'VI' => 'United States Virgin Islands',
        'UY' => 'Uruguay, Eastern Republic of',
        'UZ' => 'Uzbekistan',
        'VU' => 'Vanuatu',
        'VE' => 'Venezuela',
        'VN' => 'Vietnam',
        'WF' => 'Wallis and Futuna',
        'EH' => 'Western Sahara',
        'YE' => 'Yemen',
        'ZM' => 'Zambia',
        'ZW' => 'Zimbabwe',
    );

    if (!$countryList[$code]) {
        return $code;
    } else {
        return $countryList[$code];
    }

}

نحوه استفاده:

code_to_country('IR');

حالا این رو پاس بدید به متد ساخت دکمه

0

تشکر. مثل اینکه خود روبات همپین قابلیتی نداره که یه لیبل عنوان دکمه با مقدار دکمه متفاوت باشه و باید خود عنوان دکمه رو داخل دیتابیس جستجو کنیم و مقدارشو بدست بیارم که اینکار در پشت صحنه برنامه اتفاق میفته منظور من این بود که نیاز به اینکار نباشه و برای هر دکمه یه لیبل نشون بده ولی مقدارش متفاوت باشه(مثل: <input value="12" type="text">ali</input> که عنوان دکمه علی هست ولی مقدارش کد کاربری علی و بقیه فیلدها هم همینطور).چون دارم یه جستجو خیلی پیشرفته با حدود 15 فیلد درست میکنم که با این حساب باید 15 تا تابع مختلف تعریف کنم تا مقدار کدش رو از داخل ارایه استخراج شده از دیتابیس جستجو و بدست بیارم.
بازم تشکر.مثل اینکه تنها راه همینه

خوش آمدید

برای طرح سوال، ایجاد بحث و فعالیت در سایت نیاز است ابتدا وارد حساب کاربری خود شوید. در صورتی که هنوز عضو سایت نیستید میتوانید در عرض تنها چند ثانیه ثبت نام کنید.