• 1 رای - 3 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
افزودن query به str replace-حل کردم :D
#1
سلام به دوستای گلم.

یه سوال.

من یه مقداری رو دارم که داینامیکه و میخوام این مقدار رو جایگزین مقدار استاتیک ارسالی بکنم.

مثلا من یه مقدار رو توو فرم برام فرستادن به نام (انتخابگر)
میخوام بره از توو دیتابیس طبق فرمولی که براش نوشتم مقدار انتخابگر رو برداره بیاره جایگزین متن انتخابگر بکنه.

اما متاسفانه مقدار های انتخابگر داینامیکه و در str replace این امکان وجود نداره که یه سلکتشن داینامیک بسازم براش.
چه راه دیگه ای میتونم انتخاب کنم؟
  پاسخ
تشکر شده توسط :
#2
سوالتون خیلی گنگه،
فرمول!!!؟؟؟ منظورتون کوئری است؟ یا دستورات شرطی برای انتخاب انتخابگر مناسب از دیتابیس؟
فکر کنم منظور شما یک نوع فیلتر کلمات نامناسب یا چیزی مشابه باشه، آیا می‌خواهید یک عبارت را از کاربر دریافت کنید و سپس جایگزین متن شما در دیتابیس کنه؟ من نفهمیدم اگر انتخابگر رو از کاربر می گیره دیگه چه نیازی به انتخابش از دیتابیس دارید؟ و متنی که قراره این انتخابگر داخلش قرار بگیره از کجا میاد؟ (داخل متغییره یا از دیتابیس می‌گیرید؟)
  پاسخ
تشکر شده توسط :
#3
ببین دوست من.عزیز دلم.

یه مثال میزنم برات امیدوارم واضح باشه.

من برای کاربر توو پنل مدیریتش یه قابلیت گذاشتم که برای خودش فرم سازی انجام بده.

همینطور یه قابلیتی توو پنلش گذاشتم که بره و به گزینه های انتخابگرش اضافه کنه هرچی میخواد.

حالا طرف انتخاب گر رو برای خودش انتخاب کرده.این انتخاب گر دارای آپشن های داینامیکه.

حالا من چطوری آپشنهای داینامیکو براش توو str replace بذارم؟
  پاسخ
تشکر شده توسط :
#4
همون مثال خودتون رو توضیح میدم، من با یک کلاس اینکار رو انجام میدم و نتیجه رو در دیتابیس ثبت می‌کنم و ساختار فرم رو،
داخل دیتابیس
  • یه تیبل داریم که فرم ها داخلش نگهداری میشه،
  • یه تیبل داریم که اطلاعات فیلدها داخلش نگهداری میشه،

یک کلاس داریم که مسئول ساخت فرم هست و
  • ساخت فرم رو انجام میده،
  • ساخت فیلد رو هم انجام میده،
  • مقادیر مجاز هر فیلد رو مشخص می‌کنه،
  • اعتبارسنجی فرم رو انجام میده،

خب حالا مثلا کاربر نیاز داره:
یک input از نوع email بسازه، این کلاس تعدادی فیلد اجباری و اختیاری به کاربر نمایش میده، ضمن اینکه اعتبارسنجی این فیلد هم با RegEx انجام میشه،
حالا ایندفعه کاربر یک select میسازه تا یک dropdown list به کاربر نشون بده، در نتیجه کلاس فیلدهایی برای optionها به کاربر نمایش میده،
و ...

برای پر کردن هر فیلد هم باید یک سری فیلد به کاربر نشون بدید که پر کنه، مثلا اگر min و max به کاربر نمایش داده بشه، نوع فیلدهای مربوطه باید عددی باشه،

پروسه کار به این صورته:
  1. کاربر یک فرم می‌سازه،
  2. کاربر یک فرم میبینه که با اون میتونه فرم مورد نظر خودش رو بسازه،
  3. این فرم دارای تعدادی دکمه (به عنوان انتخابگر) است،
  4. کاربر با زدن هر دکمه یک فرم میبینه که تمام مقادیر مجاز قابل نوشتن در اون فیلد نمایش داده میشه،
  5. تعدادی از این فرم‌ها اجباری و تعدادی اختیاری هستند،
  6. کاملا مشخصه که فیلدهای اجباری باید پر بشن و بعد از زدن دکمه ساخت فیلد هم بررسی بشه که فیلدهای اجباری پر شده باشه و هم کلیه فیلدهای واردشده اعتبارسنجی بشه،
  7. فیلدهای اضافه شده جهت حذف یا ویرایش به کاربر نشون داده بشه،
  8. نمایش فیلدها میتونه هم از طریق یک جدول (جدول html) و هم به صورت یک تکست باکس که داخلش کدها به صورت bbcode به وی نمایش داده بشن،
  9. برای نمایش مثلا فرم مربوط به select هم می‌تونید، آپشن‌ها رو به چند شکل از کاربر بگیرید، مثلا با یک دکمه فیلدهایی برای آپشن زیر هم اضافه شوند (با جاوااسکریپت خیلی ساده) تا بتونه پر کنه، یا در یک تکست باکس هر خط را یک مقدار در نظر بگیرید

نمایش به کاربر نهایی، به هر حال کاربر درخواست نمایش یک فرم رو میده و شما کافیه که تمام فیلدهای فرم را با ویژگی‌های اونا بگیرید و به کاربر نشون بدید و از طریق ستون‌های مربوط به اعتبارسنجی هر فرم (مثلا RegEx یا options)، اون مقادیر رو اعتبارسنجی کنید، با یه echo تک‌تک قسمت‌های فیلد رو می‌تونید به هم بچسبونید. نیاز به str_replace ندارید.
  پاسخ
تشکر شده توسط : Y.P.Y
#5
نه دوست من.نگرفتی.

من مشابه append توو php میخوام

یه تابعی که بشه str replace رو باهاش پوشش داد
  پاسخ
تشکر شده توسط :
#6
بهتر بود اینجوری مطرح می‌کردین:
یک فانکشن یا راه حل برای تبدیل کد زیر:
کد پی‌اچ‌پی:
$input '<input type="text" name="field">'
به این کد میخوام:
کد پی‌اچ‌پی:
$input '<input type="text" name="field" placeholder="hi there">'

اینکار خیلی سادس، من یه سری راهکار میگم تا ایده کاری که میخواهید انجام بدید رو بهتر بگیرید، نوشتن این راه‌ها به معنی بهینه بودن اونا نیست:
1. ساده‌ترین راه‌حل استفاده از همون str_replace بود، هر متغییر یک فیلد (فیلدِ html) داره پس در هر متغییر شما یکبار علامت بستن تگ "<" تکرار شده، پس باید:
کد پی‌اچ‌پی:
<?php
$input 
'<input type="text" name="field">';

$attribute 'placeholder="hi there"';

echo 
str_replace('>'' ' $attribute '>'$input); 
خب اگه پراپرتی‌ها بیشتر باشه، یک foreach کار رو تموم میکنه.

2. با تبدیل به آرایه و برعکس
کد پی‌اچ‌پی:
<?php
$input 
'<input type="text" name="field">';
$inputArray explode(' '$input);

unset(
$inputArray[count($inputArray)-1]);

array_push($inputArray'placeholder="hi there"'"disabled"'>');

echo 
implode(' '$inputArray); 

3. با ArrayObject
کد پی‌اچ‌پی:
<?php
$input 
'<input type="text" name="field">';
$inputArray explode(' '$input);

unset(
$inputArray[count($inputArray)-1]);

$arrayObject = new ArrayObject($inputArray);

$arrayObject->append('placeholder="hi there"');
$arrayObject->append('disabled');
$arrayObject->append('>');

foreach (
$arrayObject as $piece) {
    echo 
$piece ' ';


4. بهینه ترین روش استفاده از RegEx است:
کد پی‌اچ‌پی:
<?php
$input 
'<input type="text" name="field">';

$pattern ='/name="[a-zA-z0-9]+"/';

$attribute 'placeholder="placeholder"';

echo 
preg_replace($pattern'$0 ' $attribute$input); 

این میاد و مثل یه فانکشن append عمل میکنه، در واقع با یک مثال:
کد پی‌اچ‌پی:
<?php
function append($input$attribute) {
    return 
preg_replace('/name="[a-zA-z0-9]+"/''$0 ' $attribute$input);
}

echo 
append('<input type="text" name="field">''placeholder="placeholder"'); 

اگه سوالتون این نبود، چگونه پاسخ مشکل خود را سریع بیابیم رو مطالعه بفرمایید و بعد لطف کنید مجددا سوالتون رو مطرح کنید.
  پاسخ
تشکر شده توسط : Y.P.Y
#7
اره دقیقا همینه.
با این تفاوت که من میخوام ایندفعه یه select که دارای فیلدهای داینامیکه به فرم اضافه کنم
  پاسخ
تشکر شده توسط :
#8
راه حل رو یافتم دوست عزیزم:

کد پی‌اچ‌پی:
$VARABLE='
                            <div class="col-md-4" style="float: right">
                                <div class="form-group">
                                      <label for="wr">نوع وریبل: </label>
                                      <select class="form-control required" name="wr" id="warable">
                                          <option>انتخاب کنید</option>
                                          {OPTIONCODE}
                                      </select>
                                </div>
                            </div>
'
;

        
$sn_count 1;
        
$html '';
        foreach (
$estatecats as $estatecat) {
            
$html .= "<option class=\"$sn_count\" value=\"$estatecat->id\">"
                
$estatecat->varable
                
"</option>";
            
$sn_count++;
        }
        echo 
$html
از همون روش str replace

کد پی‌اچ‌پی:
$encode str_replace("{MYCODE}"$VARABLE$request['code']);
            
$encode str_replace('{OPTIONCODE}'$html$encode); 
  پاسخ
تشکر شده توسط :
#9
اینکه راه حل یافته شده خودتان را داخل پست آخر نوشتید کار خیلی خوبی بود. من از طرف سایرین قدردانی می‌کنم.
بزارید یه نگاهی به کدتون بندازیم،
اول html:
class جز attributeهای option نیست و اگر هم بود شما مجاز به نوشتن عدد یا شروع نام کلاس با عدد نبودید.
چرا اولین تگ div یک استایل با مقدار float: right دارد؟ با pull-right می‌توانید کار float-right رو انجام بدید، در مورد columnها هم گریدبندی بوتسترپ رو مشاهده کنید، با offset به نتیجه دلخواهتون می‌رسید. تا حد ممکن استایل inline ننویسید. یا از یک نسخه rtl استفاده کنید. برای جابجایی هم از pull و push استفاده کنید:
کد:
<div class="row">
    <div class="col-sm-3 col-sm-push-9">left</div>
    <div class="col-sm-9 col-sm-pull-3">right</div>
</div>
اگر قرار است select شما اجباری باشد، چرا یک option به آن اختصاص داده‌اید؟ همه افراد می‌دانند که از dropdown لیست‌ها باید یک مقدار را انتخاب کنند و multiple هم نیست که کاربر بتواند چندین مقدار را ارسال کند. از طرفی از لحاظ تجربه کاربری حتی اگر مجبور بودید اینکار را با optgroup انجام بدید بهتره تا کاربر نتواند مقداری را انتخاب کند.

درباره کد php:
اول متغییر $VARIABLE را به شکل حروف کوچک بنویسید. ($variable)
برای منطق برنامه هم توصیه می‌کنم یک فانکشن تعریف کنید و با هر بار فراخوانی اون یه option اضافه کنید، فراموش نکنید که انتهای آن دوباره یک {OPTIONCODE} قرار بدید تا بتوانید دوباره هم option اضافه کنید، در انتها هم پس از اتمام کار این مورد را پاک کنید. ولی راحت‌تر این است که به جای {OPTIONCODE} از همون option پیش‌فرض استفاده کنید. یا یک فانکشن تعریف کنید و داخلش کل option‌ها رو جایگذاری کنید.
تا حد ممکن Stringهای خود را داخل ' قرار بدید و با . به هم متصل کنید. پرفورمنس بهتری نسبت به " دارد.

در کل هم توصیه می کنم PSRها رو حتما مطالعه کنید.
موفق باشید.
  پاسخ
تشکر شده توسط : majid_goudarzi
#10
سلام.ممنون از نکته سنجیت.

اما من همینجا این کد رو نوشتم.کاملا پیشفرض بود.چون توو مثالم از codeloger آنلاین استفاده کردم برا همین سرسری نوشتمش.

انقدم که من کثیف کار نمیکنم عشقمHeartHeartBig GrinBig Grin

در مورد کلاس ها هم باید عرض کنم که متعارف نیست که کلاس استفاده کنم یا درون کلاس بیام و از NUM استفاده کنم.

اما بخاطر اینکه بیاد و از دیتابیس همه رکوردامو بخونه و فقط آخری رو دریافت نکنه این کار رو انجام دادم.

تنها اتریبیوت بی تاثیر هم براش کلاس بودBig Grin

بازم از اساتید عذرمیخوام که php رو به چالش کشیدمAngel
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان