CodeIgniter: สร้างผู้ช่วยใหม่ใช่ไหม


178

ฉันจำเป็นต้องวนซ้ำอาร์เรย์ในวิธีที่แตกต่างกันและแสดงในหน้า อาร์เรย์ถูกสร้างโดยคลาสโมดูล ฉันรู้ว่ามันไม่ดีกว่าที่จะรวมฟังก์ชั่นใน 'มุมมอง' และฉันต้องการทราบว่าจะแทรกไฟล์ฟังก์ชั่นอย่างไร

ฉันรู้ว่าฉันสามารถ 'ขยาย' ผู้ช่วยได้ แต่ฉันไม่ต้องการขยายผู้ช่วยเหลือ ฉันต้องการสร้างผู้ช่วยด้วยฟังก์ชั่นการวนซ้ำ .. ขอให้เรียกว่า loops_helper.php


ทำไมคุณไม่สามารถส่งผ่านอาร์เรย์เหล่านั้นไปยังมุมมองได้
Mike Hordecki

ฉันได้ แต่พลาดท่าที่จุด sepparating มุมมองจากฟังก์ชั่นที่ ..
โจนาธาน

คำตอบ:


378

ตัวช่วย CodeIgniter เป็นไฟล์ PHP ที่มีฟังก์ชั่นมากมาย มันไม่ได้เป็นคลาส

สร้างไฟล์และใส่รหัสต่อไปนี้ลงไป

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

if ( ! function_exists('test_method'))
{
    function test_method($var = '')
    {
        return $var;
    }   
}

บันทึกนี้เพื่อการประยุกต์ใช้ / ผู้ช่วย / เราจะเรียกมันว่า "new_helper.php"

บรรทัดแรกมีอยู่เพื่อให้แน่ใจว่าไม่สามารถรวมไฟล์และเรียกใช้จากนอกขอบเขต CodeIgniter ทุกอย่างหลังจากนี้เป็นการอธิบายตนเอง

การใช้ตัวช่วย


นี้สามารถของคุณในการควบคุม , รูปแบบหรือมุมมอง (ไม่นิยม)

$this->load->helper('new_helper');

echo test_method('Hello World');

<your-web-app>\application\config\autoload.phpถ้าคุณใช้ตัวช่วยนี้ในหลายสถานที่ที่คุณสามารถมีมันโหลดโดยอัตโนมัติโดยเพิ่มไปเช่น AUTOLOAD แฟ้มการกำหนดค่า

$autoload['helper'] = array('new_helper');

-Mathew


33
ใช้ประโยชน์ทุกครั้งที่ชื่อไฟล์ตัวช่วยถูกต่อท้ายด้วย "_helper" มิฉะนั้นคุณจะได้รับข้อผิดพลาด ดังนั้น "helper_name" จะไม่ทำงาน แต่ตั้งชื่อไฟล์ของคุณ "name_helper"
Bhumi Singhal

3
ในฐานะของ CI2 คุณจะต้องรับอินสแตนซ์ CI เพื่อใช้ตัวช่วยภายในโมเดล: $ ci = get_instance (); $ CI-> load-> ผู้ช่วย ( 'name_helper');
Evernoob

3
แค่ทราบผู้ช่วยไม่จำเป็นต้องเป็นหน้าที่ มันสามารถเป็นคลาสได้เช่นกัน ยกตัวอย่างเช่นตรวจสอบกลยุทธ์ที่จะสร้าง "Widgets" มากกว่าที่EllisLab ของฟอรั่ม จากนั้นคุณสามารถใช้คลาสนั้นได้ทุกที่ ... เช่นกันคุณสามารถโหลดผู้ช่วยของคุณลงในอินสแตนซ์ CI หากคุณต้องการรับอินสแตนซ์แล้วตั้งค่า$thisเป็นคุณสมบัติของมัน ... ทั้งหมดถ้าคุณต้องการแน่นอน
General Redneck

2
function_exists ใช้งานอย่างไร มันเป็นสิ่งที่ทำให้ลุกไหม้รหัสมันเป็นสิ่งที่ปฏิบัติทั่วไปที่ดี PHP? ทำไมคุณต้องการมัน
skrln

2
@skrln มีโอกาสที่คุณจะมีตัวช่วยโหลดอัตโนมัติ (ลองเรียกมันว่าcool_helper) และถ้าคุณลืมและเรียกด้วยตนเอง$this->load->helper('cool_helper')หลังจากที่มันถูกโหลดอัตโนมัติคุณจะได้รับข้อผิดพลาด "กำหนดไว้แล้ว" หรือบางสิ่งบางอย่างของ PHP สิ่งนี้จะป้องกันไม่ให้โหลดรหัสเดียวกันสองครั้ง (มันเหมือนกับinclude_once()ฟังก์ชั่น PHP แต่สำหรับผู้ช่วย CodeIgniter เพื่อหลีกเลี่ยงปัญหา) โดยพื้นฐานแล้วแปลเล็ก ๆ น้อย ๆ : ถ้าฟังก์ชั่นไม่ได้อยู่ก็หมายความว่าผู้ช่วยไม่ได้โหลด มานิยามกัน
Alejandro Iván

79

โค้ดบางอย่างที่อนุญาตให้คุณใช้อินสแตนซ์ CI ภายในตัวช่วย:

function yourHelperFunction(){
    $ci=& get_instance();
    $ci->load->database(); 

    $sql = "select * from table"; 
    $query = $ci->db->query($sql);
    $row = $query->result();
}

1
@ r4ccoon ถูกต้อง ไม่ได้ใช้เวลา 5 นาทีเพื่อกลับไปหาคำนิยามอินสแตนซ์ :)
user1048839

@ r4ccoon และนั่นคือเคล็ดลับที่ยอดเยี่ยม
อรุณ

17

ดีสำหรับฉันทำงานเพิ่มข้อความ"_helper"หลังจากในไฟล์ php เช่น:

ผู้ช่วยเหลือ Codeiginiter

และโหลดโดยอัตโนมัติผู้ช่วยในโฟลเดอร์aplication -> ไฟล์ autoload.phpเพิ่มในตัวช่วยอาร์เรย์เป็นชื่อโดยไม่ต้อง "_helper" เช่น:

$ autoload ['helper'] = อาร์เรย์ ('comunes');

และด้วยการที่ฉันสามารถใช้ฟังก์ชั่นผู้ช่วยทั้งหมดได้


1
ฉันเพิ่งค้นพบว่าอย่างที่คุณพูด CodeIgniter จะต้องใช้_helperที่ส่วนท้ายของชื่อไฟล์
Jared Eitnier

@ Jared ใช่มันเป็นกรณีสำหรับฉันมันต้อง _helper ที่ท้ายชื่อไฟล์!
pollux1er

11

ในการสร้างผู้ช่วยใหม่คุณสามารถทำตามคำแนะนำจาก The Pixel Developerแต่คำแนะนำของฉันไม่ได้เป็นการสร้างตัวช่วยสำหรับตรรกะที่จำเป็นโดยเฉพาะบางส่วนของแอปพลิเคชันเฉพาะ ให้ใช้ตรรกะนั้นในคอนโทรลเลอร์เพื่อตั้งค่าอาร์เรย์เป็นค่าสุดท้ายที่ต้องการ เมื่อคุณได้รับแล้วคุณจะส่งต่อไปยังมุมมองโดยใช้Template Parser Classและ (หวังว่า) คุณสามารถรักษามุมมองให้สะอาดจากสิ่งใดก็ตามที่ดูเหมือนว่า PHP โดยใช้ตัวแปรอย่างง่ายหรือคู่แท็กตัวแปรแทน echos และ foreachs เช่น:

{blog_entries}
<h5>{title}</h5>
<p>{body}</p>
{/blog_entries}

แทน

<?php foreach ($blog_entries as $blog_entry): ?>
<h5><?php echo $blog_entry['title']; ?></h5>
<p><?php echo $blog_entry['body']; ?></p>
<?php endforeach; ?>

ประโยชน์อีกประการหนึ่งของวิธีนี้คือคุณไม่ต้องกังวลเกี่ยวกับการเพิ่มอินสแตนซ์ CI ตามที่คุณต้องการหากคุณใช้ผู้ช่วยที่กำหนดเองเพื่อทำงานทั้งหมด


3

สร้างไฟล์ที่มีชื่อผู้ช่วยของคุณใน/ application / helpersและเพิ่มลงในไฟล์ autoload config / โหลดด้วยตนเอง

เช่นวางไฟล์ชื่อuser_helper.phpใน/ application / helpersด้วยเนื้อหานี้:

<?php
  function pre($var)
  {
    echo '<pre>';
    if(is_array($var)) {
      print_r($var);
    } else {
      var_dump($var);
    }
    echo '</pre>';
  }
?> 

ตอนนี้คุณสามารถโหลดผู้ช่วยผ่าน$this->load->helper(‘user’);หรือเพิ่มไปยังapplication / config / autoload.phpการตั้งค่า


3

เพียงแค่กำหนดตัวช่วยในไดเรกทอรีแอพพลิเคชั่นตัวช่วยแล้วโทรจากคอนโทรลเลอร์ของคุณเพียงแค่ชื่อฟังก์ชั่นเช่น

helper name = new_helper.php
function test_method($data){
 return $data
}   

ในคอนโทรลเลอร์โหลดตัวช่วย

$this->load->new_helper();
$result =  test_method('Hello world!');
if($result){
 echo $result
}

การส่งออกจะเป็น

Hello World!

3

ในการดึงรายการจากไฟล์ปรับแต่งของคุณให้ใช้ฟังก์ชั่นต่อไปนี้:

$this->config->item('item name'); โดยที่ item item คือดัชนี $ array array ที่คุณต้องการเรียกคืน ตัวอย่างเช่นเมื่อต้องการดึงตัวเลือกภาษาของคุณคุณจะทำสิ่งนี้:

$lang = $this->config->item('language'); ฟังก์ชันจะคืนค่า FALSE (บูลีน) หากไม่มีรายการที่คุณพยายามดึงข้อมูล

หากคุณใช้พารามิเตอร์ตัวที่สองของฟังก์ชัน $ this-> config-> load เพื่อกำหนดรายการปรับแต่งของคุณให้กับดัชนีเฉพาะคุณสามารถดึงข้อมูลได้โดยระบุชื่อดัชนีในพารามิเตอร์ตัวที่สองของ $ this-> config- > ฟังก์ชั่น item () ตัวอย่าง:

// โหลดไฟล์ปรับแต่งชื่อ blog_settings.php และกำหนดให้กับดัชนีที่ชื่อว่า "blog_settings"

$this->config->load('blog_settings', TRUE);

// ดึงไอเท็มปรับแต่งชื่อ site_name ที่มีอยู่ในอาร์เรย์ blog_settings

$site_name = $this->config->item('site_name', 'blog_settings');

// วิธีอื่นในการระบุรายการเดียวกัน:

$blog_config = $this->config->item('blog_settings');

$ site_name = $ blog_config ['site_name'];

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.