2013-02-13 9 views
16

मेरे पास एक तिथि कॉलम है जो आम तौर पर dd.MM.yyyy के रूप में मान लेता है।मैं वाईआई में एनयूएलएल की तारीख कैसे सेट कर सकता हूं?

array('start, end', 'date', 'format' => 'dd.MM.yyyy'), 

मैं एक CSV फ़ाइल से डेटाबेस को आबाद करने कर रहा हूँ, और मैं NULL लिए तिथि निर्धारित करने में सक्षम होना चाहते हैं (यानी कुछ भी नहीं) यदि सीएसवी रिकॉर्ड: मॉडल का rules() में इसके सत्यापन नियम यह है खाली है। तो, मैं कर रहा हूं:

if (empty($csv_data)) { 
    $user->start = new CDbExpression('NULL'); 
} else { 
    $user->start = $csv_data; 
} 

लेकिन मुझे एक त्रुटि मिलती है कि दिनांक प्रारूप अमान्य है। ऐसा क्यों है?

CDateValidator documentation कहता है कि allowEmpty संपत्ति डिफ़ॉल्ट रूप से सत्य है, इसलिए इसे NULL पर सेट करने में सक्षम होना चाहिए, है ना? ध्यान दें कि अगर मैं तारीख को "" स्ट्रिंग का आकलन कर रहा हूं, तो यह इसे 0000-00-00 00:00:00 टाइमस्टैम्प में परिवर्तित कर देगा, जो NULL नहीं है।

+3

https://github.com/yiisoft/yii/issues/2056 – dInGd0nG

+0

मैं वाईआई पर एक विशेषज्ञ नहीं हूं लेकिन दस्तावेज़ों को देखकर आप इस विधि का उपयोग करके इसके आसपास काम कर सकते हैं यह जांचने के लिए कि क्या मूल्य isnull() है? http://www.yiiframework.com/doc/api/1.1/CValidator#except-detail – Jason

+0

@ dInGd0nG दिलचस्प, जो असफलता बताता है, धन्यवाद। – slhck

उत्तर

24

:

array('start, end', 'date', 'format' => 'dd.MM.yyyy'), 
array('start, end', 'default', 'setOnEmpty' => true, 'value' => null), 

भी

if (empty($csv_data)) { 
    $user->start = null; 
} ... 

भी चाल करना चाहिए।

+0

वह नियम ठीक है जो मैं बाद में हूं, क्योंकि यह तब भी काम करता है जब तारीख को मैन्युअल रूप से फ्रंटेंड से हटा दिया जाता है। – slhck

3

इस के लिए तुच्छ ठीक निर्माण के दौरान सभी पर मूल्य स्थापित करने के लिए नहीं है:

if (!empty($csv_data)) { 
    $user->start = $csv_data; 
} 

इस तरह, तिथि निर्धारित नहीं की जाएगी और इस तरह के रूप में खाली दिखाई देते है, जो भी मान्यता गुजरता है।

2

फ़ील्ड में CDbExpression असाइन करना (और चाहिए) सत्यापन कभी पास नहीं करेगा; सत्यापनकर्ता null की अनुमति देता है लेकिन यह निश्चित रूप से क्षेत्र के मूल्य के रूप में मनमाने ढंग से CDbExpression की अनुमति नहीं दे सकता है; यह आश्चर्यजनक नहीं होना चाहिए।

यदि आप डेटाबेस में null लिखना चाहते हैं तो इसे $user->start = null के साथ करें - यहां पर CDbExpression शामिल करने का कोई कारण नहीं है।

एक और दृष्टिकोण आप मामले में इस्तेमाल कर सकते हैं आप CDbExpression उपयोग करने के लिए रिकॉर्ड को मान्य करने के लिए नहीं save बताने के लिए किया जाएगा की जरूरत थी और में के रूप में मैन्युअल रूप से इसे करते हैं, मॉडल rules() में

$attributes = $user->attributeNames(); 
if (empty($csv_data)) { 
    $user->start = new CDbExpression('NULL'); 
    $attributes = array_diff($attributes, array('start')); // don't validate this 
} else { 
    $user->start = $csv_data; 
} 

if ($user->validate($attributes)) { // validate only attributes we want here 
    $user->save(false); // no validation at all here 
} 
संबंधित मुद्दे