תקלת XML – שנקראת Invalid at the top level of the document

אני משתמש ב-MSXML כדי לקבל XML באמצעות VBA, שנשלח מ-PHP .

מסיבה לא ברורה, לפעמים יש סימן שאלה *לפני* התו הראשון.
זה נראה כך :

?

מה שגורם לתקלה "קטנה" ב-XML.

הבעיה : תקלות ב-MSXML לא תמיד מדווחות כתקלות VBA
לכן קשה לדעת שהייתה תקלה כי (Err.number=0)

פתרונות משולבים :
1. כדי לדעת אם הייתה תקלה יש להשתמש ב
xmlOBJECT.parseError.errorCode - עבור הקוד של התקלה
ועבור התיאור ב - reason במקום errorcode.

2. כדי להתמודד עם זה, יש לזהות את הקוד ASCII של התו הראשון, ולנקות אותו.

סיכום מתומצת בעברית CakePHP – חלק 1

מבנה תיקיות:
בתיקיה הראשית יש 3 תיקיות:
app – התיקיה בה אתה יוצר את האפליקציות
lib – תיקית המנוע, בה אסור לגעת
vendors – תיקיה לספריות חיצוניות שבהן משתמשים.
בנוסף התיקיה מכילה קובץ Index.php וגם קובץ htaccess.

מבנה תיקית app :

תיקית app מכילה מספר תיקיות :
config – קבצי הגדרות, קישור לדאטאבייס, bootstarp וכדומה.
console – פקודות ל-Console. וניתן להכיל בתוך התיקיה הזו גם Templates.
תיקיות Controller / Model / View – אין מה לפרט, לפי מודל ה-MVC.
Lib – עוד תיקית לסריות חיצוניות, למה יש גם כאן וגם בתיקית האם ? כדי להפריד ספריות של ספקים חיצונים שיאוחסנו בתוך vendors בתיקית האם, ולעומת זאת ספריות שאתה כותב, יאוחסנו כאן.
locale – קבצי תרגום לשפות שונות.
plugin … ברור.
test – מכילה את כל ה-test cases, פירוט בהמשך.
tmp – לוגים, לפעמים שמירה של Sessions ועוד. התיקיה חייבת להיות קיימת, ועם הרשאות כתיבה.
Vendor – ספריות של ספקים חיצוניים . ברגע ששמים אותם כאן, אפשר לקרוא לפונקציות שלהם בצורה הרגילה
כלומר App::import('vendor','name'); הסיבה לכפילות עם תיקיה דומה בתיקית האם תוסבר בהמשך.

webroot – בסביבת יצור, זו תיקית האם, ובתוכה יהיו גם קבצי CSS, JS, תמונות וכדומה.

מקור : http://book.cakephp.org/2.0/en/getting-started/cakephp-folder-structure.html

מוסכמות במתן שמות ב- CakePhp

מוסכמות של מתן שמות, הן עניין גדול ב-CakePhp שאם שומרים עליו מסייע רבות לכל אורך הדרך.

מוסכמות שמות עבור Controller

– נכתבים בלשון רבים
– מסתיימים במילה Controller
למשל : PeopleController and LatestArticlesController

המתודה הראשונה של קונטרלר היא תמיד index() .
ולכן כאשר מבצעים request לקונטרולר, זו המתודה שמוחזרת כברירת מחדל.
למשל הכתובת http://www.example.com/apples/ מחזירה את המתודה index() של אוביקט ApplesController.
כאשר ה-View של אותו אוביקט יהיה בכתובת http://www.example.com/apples/view/
ויקרא למתודה view() של אוביקט ApplesController.

ישנה גם שיטה לשלוט על הנראות למתודות מסויימות. נניח שאנחנו כותבים מתודה לשימוש פרטי שלנו כמנהלי מערכת. אז פשוט מתחילים את המתודה עם מקף תחתון.
דוגמא :

class NewsController extends AppController {

    public function latest() {
        $this->_findNewArticles();
    }

    protected function _findNewArticles() {
        // Logic to find latest news articles
    }
}

אז הגישה למתודה תהיה דרך http://www.example.com/news/latest/ אבל מי שיקליד http://www.example.com/news/_findNewArticles/ יגיע לדף שגיאה.

מבנה URL לפי המוסכמות של קונטרולרים

כל עוד הקונטרולר כתוב לפי המוסכמות, אז מספיקה מילת השם שלו, בלשון רבים, באותיות קטנות בתור URL.
למשל, קונטרולר בשם ApplesController – ניגש אליו באמצעות הכתובת http://example.com/apples.

לגבי ביטויים שמורכבים ממספר מילים, אפשר להשתמש בכל הצורות של החיבור (עם /בלי מקף תחתון בין המילים, וכאשר כל מילה מתחילה באות גדולה או קטנה). אבל יחד עם זאת, ה-URL תמיד יהיה אותיות קטנות, עם מקף תחתון.
למשל אם יש לנו מתודה RedApplesController::go_pick , אז ה-URL שלה יהיה /red_apples/go_pick

מוסכמות לשמות קבצים ושמות Class

שמות קבצים ושמות קלאסים תמיד CamelCased כלומר כל מילה מתחילה באות גדולה. שם הקובץ יהיה אותו דבר בדיוק עם נקודה והסיומת php.

לדוגמא :
הקלאס יקרא MyNiftyClass
אז הקובץ יקרא MyNiftyClass.php

עוד דוגמא לקלאס EspeciallyFunkableBehavior , אז שם הקובץ יהיה EspeciallyFunkableBehavior.php .

אם יש לי קונטרולר אז הוא יקרא KissesAndHugsController
ושם הקובץ יקרא MyHandyComponent.php

אם יש לי מודל שנקרא OptionValue
אז שם הקובץ יהיה OptionValue.php

כל קובץ כמובן בתיקיה שבה הוא צריך להיות.

מוסכמות לגבי שמות מודל ושמות של רכיבים בדאטאבייס

שמות של קלאסים במודל, הם תמיד CamelCased, בלשון יחיד. למשל Person, BigPerson, and ReallyBigPerson.

שמות של טבלאות שתואמות למודלים הן תמיד בלשון רבים, והמילים מופרדות בקו תחתון. למשל people, big_people, and really_big_people.

יש בקישור הזה הסבר על היכולות של יחיד/רבים ב-CakePHP.

שמות שדות שמורכבות מכמה מילים, מופרדות בקו תחתון. my_field

שמות של מפתחות זרים מורכבים משם הטבלה המקורית עם סיומת _id למשל., אם לאופה אחד יש הרבה עוגות, אז המפתח הזר שמתייחס לטבלה bakers יקרא בשם baker_id (מה שמסביר שוב פעם למה שמות הטבלאות הן בלשון רבים).

אם יש טבלאות שעושים להם join בקשר hasAndBelongsToMany , אז קוראים להם בשם טבלאות המודל שהם מצרפות יחד , בסדר אלפביתי, נניח אני עושה join לטבלאות apples וגם zebras אז המודל יקרא apples_zebras כי a הוא לפני z.

כל טבלה ב-CakePHP חייבת מפתח ראשי יחיד, הפריימוורק לא מטפל במפתחות ראשיים מורכבים (כלומר מכמה שדות יחד).
כלומר אם יש לך טבלה שאתה רוצה להשתמש בה עם הפריימוורק אתה חייב שיהיה לה מפתח ראשי יחיד.
(אפשר לעשות שאילתות לעדכון מפתחות מורכבים באמצעות הפונקציה query).

המפתח הראשי יכול להיות מספר רץ (auto-increment ) או char(36) ואז יש מתודה שנקראת String::uuid שנותנת לו מפתח.

מוסכמות לגבי View

שמות של הקבצים שמכילים את ה – view, הם תמיד מורכבים משמות הפונקציות של הקונטרולר שאותו הן מציגות , אבל עם קו תחתון.
למשל הפונקציה getReady() ששייכת לקונטרולר PeopleControler , תחפש את ה-View שלה כאן /app/View/People/get_ready.ctp

דוגמא אחרונה, שמסכמת הכל ומציגה שאפשר להשתמש גם בלשון רבים שמובנה בתוך המילה, ולאו דווקא עם S בסוף :
Database table: “people”
Model class: “Person”, found at /app/Model/Person.php
Controller class: “PeopleController”, found at /app/Controller/PeopleController.php
View template, found at /app/View/People/index.ctp

המבנה הוא תמיד /app/View/Controller/underscored_function_name.ctp

מקור : http://book.cakephp.org/2.0/en/getting-started/cakephp-conventions.html

איך להתקין mcrypt על php (לינוקס redhad )

בתיעוד הרשמי של php, כתוב שכדי להתקין את התוספת mcrypt יש צורך לקמפל מחדש את php.

לפי ההמלצה כאן לא צריך לנסות לקמפל לבד.

הוא ממליץ שם לבצע התקנה באמצעות RPM יחד עם YUM .

הסברים למושגים אלו :
RPM – זוהי המילה עבור "חבילת התקנה" בלינוקס
YUM – זוהי תוכנה שמתקינות חבילות RPM, התוכנה מבוססת על פקודות משורת הפקודה (ויש גם ממשק גרפי באמצעות הרחבות)

ה-RPM שהוא ממליץ עליו, נמצא בפרויקט שנקרא EPEL,
EPEL – זהו פרויקט של חבילות התקנה שמתאימות ל- RedHat .
זהו פרויקט חופשי.

לעבודה :
– תשיגו הרשאה של אדמיניסטרטור (sudo su – , ראו באחד הפוסטים הקודמים)
– הפקודה הבאה יוצרת קשר לפרויקט EPEL, כך שאפשר להשתמש ב-YUM , והוא יחפש חבילות התקנה גם ב-EPEL.

su -c 'rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm'

* הערה , אני השתמשתי בקישור שמיועד עבור redHat 6 , כמובן, תתאימו את זה לצורך שלכם, הקישורים משתנים מדי פעם, ראו כאן

– עכשיו אפשר להשתמש פשוט בתוכנת YUM (כמובן, שימו לב למה שהיא רושמת, ותענו y איפה שצריך ).

yum install php-mcrypt

וזהו, התוספת mcrypt מותקנת על ה-php אצלכם בשרת.

כדי לבדוק אם ההתקנה תקינה , צרו דף עם הפקודה phpinfo , וחפשו את התוספת mcrypt .

בהצלחה!

איך לבדוק את מגבלת ההעלאה בשרת , ואיך לשנות אותה באמצעות php ?

שלום,

הערה חשובה : פעמים רבות בהוסטינג שיתופי , תוכלו רק *לדעת* מה המגבלה
אבל – לא תוכלו לשנות אותה
כי קובץ ההגדרות של php נמצא בשליטת מנהל השרת.

לבדיקה :

echo "Hellon";

echo ini_get('upload_max_filesize');
echo "
"; echo ini_get('post_max_size');

ולצורך שינוי (שוב פעם – רק אם השליטה בידכם, אחרת זה פשוט לא יעשה כלום ).


ini_set('upload_max_filesize','40M');
echo "

And Now :


"; echo ini_get('upload_max_filesize'); echo "
"; echo ini_get('post_max_size');

איך לבדוק את פונקציות ה-FTP מופעלות ב-PHP על ההוסטינג שלך ?

בעיקרון התוספת של FTP מובנה בתוך php

אבל זה מצריך הגדרה בזמן ההתקנה של php על השרת

ואם אתם בהוסטינג שיתופי – זה לא תמיד בידכם

אז ככה תבדקו אם זה פעיל או לא :


if(function_exists('ftp_connect')) 
{ 
    echo 'ftp is ENABLED';
} 
else 
{ 
    echo 'ftp is NOT enabled';
} 

איך להציג מסמכי word בתוך Chrome באמצעות Header

כידוע , אפשר להציג קבצים רבים בתוך הדפדפן, אם מגדירים נכון את ה-Header של העמוד (יש פקודת php עבור זה)

אבל – בכרום… זה לא מובנה.

בשביל צריך להוריד מהחנות של Chrome בחינם את
תוסףDocs PDF/PowerPoint Viewer

בחלק מהמקרים צריך גם את
Chrome Office Viewer (Beta)

איך לעשות לולאה על רשומות נבחרות בטופס מסוג Multiple Records של ScriptCase

ל-ScriptCase יש טופס נפלא שנקרא multiple records , היתרון העצום שלו הוא שהוא מזהה לבד באיזה רשומות המשתמש מטפל, ומציע כפתור שישמור את כל הרשומות האלו *יחד*, בפעולה אחת.

עכשיו – נניח ואני רוצה ליצור לולאה על כמה רשומות נבחרות
על פניו – זה נראה בעיה ,
כיוון שיש אומנם שדה (לא בדאטאבייס, רק על המסך) של ScriptCase שמזהה את הטיפול ברשומה, וזה באמת שדה CheckBox.
אבל
אי אפשר לגשת אליו בצורה קלה.

ולכן – עשיתי ככה :
1 הוספתי שדה על המסך בלבד – מסוג CheckBox
2 בשדה הזה – ה-Lookup הוגדר Manual, עם ערך בודד של 1 במקרה של ChecK (כלומר אם סימנו אותו =1 )
3 אחרכך באירוע OnLoad של הטופס – הגדרתי מערך ריק,
4 כאשר ב-Gloabal Variable הגדרתי אותו כ-Out
5 באירוע OnLoadRecord של כל רשומה – איפסתי את הערך הרלוונטי במערך, כאשר שימו לב
ה-Key שלי במערך הוא – המפתח הראשי של הרשומה .

[selected][{id_partner}] = 0;

6 עכשיו עשיתי אירוע Ajax על OnClick של השדה מסוג CheckBox
ובאירוע הזה למעשה אני מציג באיבר הרלוונטי במערך – את הערך של ה-CheckBox
כלומר אם הוא מסומן – אנחנו נקבל 1, אחרת נקבל 0

 [selected][{id_partner}] = {select_record};

7 עכשיו הגענו סוף סוף לכפתור , תגדירו כפתור חדש בטופס
וזה הקוד שמציג בסוף את המפתחות הראשיים של הרשומות הנבחרות :

foreach (array_keys([selected], 0, true) as $key)
{
unset([selected][$key]); //get rid of the unselected id's
}
$selection = implode(',',array_keys([selected])); // now you have a comma separated list of id's of your selected records
echo $selection;

הסבר קצר לקוד
הפונקציה Array_keys – יוצרת "מערך" שמכיל רק את המפתחות.
הפרמטר השני שהוא אפס – אומר לפונקציה להחזיר רק מפתחות שמכילים 0.
והפרטמטר השלישי – true אומר לפונקציה שהאפס חייב להיות מאותו סוג משתנה , כמו האופרטור === ב-php

בתוך הריצה של הלולאה – אנחנו למעשה מוחקים את כל האיברים שמכילים 0.

ואז אחרי הלולאה – הפונקציה implode למעשה יוצרת מחרוזת עם כל איברי המערך (שנותרו) , ובינהם היא שמה פסיק.
ולבסוף מציגים את זה.

זהו תרגום בעברית, מסודר יותר, של מה שכתוב בדיון הזה בפורום :
http://www.scriptcase.net/forum/showthread.php?5574-How-select-records-from-a-multiple-record-form-flagging-row-specific-check-box-field&highlight=selected