/** * Renders a view * * @param string $path * @param array $params * @return string */ PHP_METHOD(Phalcon_Mvc_View_Simple, render){ zval *path, *params = NULL, *cache, *is_started = NULL, *key = NULL, *lifetime = NULL; zval *cache_options, *content = NULL, *view_params; zval *merged_params = NULL, *is_fresh; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 1, &path, ¶ms); if (!params) { PHALCON_INIT_VAR(params); } /** * Create/Get a cache */ PHALCON_INIT_VAR(cache); phalcon_call_method(cache, this_ptr, "getcache"); if (Z_TYPE_P(cache) == IS_OBJECT) { /** * Check if the cache is started, the first time a cache is started we start the * cache */ PHALCON_INIT_VAR(is_started); phalcon_call_method(is_started, cache, "isstarted"); if (PHALCON_IS_FALSE(is_started)) { PHALCON_INIT_VAR(key); PHALCON_INIT_VAR(lifetime); PHALCON_OBS_VAR(cache_options); phalcon_read_property_this(&cache_options, this_ptr, SL("_cacheOptions"), PH_NOISY_CC); /** * Check if the user has defined a different options to the default */ if (Z_TYPE_P(cache_options) == IS_ARRAY) { if (phalcon_array_isset_string(cache_options, SS("key"))) { PHALCON_OBS_NVAR(key); phalcon_array_fetch_string(&key, cache_options, SL("key"), PH_NOISY); } if (phalcon_array_isset_string(cache_options, SS("lifetime"))) { PHALCON_OBS_NVAR(lifetime); phalcon_array_fetch_string(&lifetime, cache_options, SL("lifetime"), PH_NOISY); } } /** * If a cache key is not set we create one using a md5 */ if (Z_TYPE_P(key) == IS_NULL) { PHALCON_INIT_NVAR(key); phalcon_md5(key, path); } /** * We start the cache using the key set */ PHALCON_INIT_VAR(content); phalcon_call_method_p2(content, cache, "start", key, lifetime); if (Z_TYPE_P(content) != IS_NULL) { phalcon_update_property_this(this_ptr, SL("_content"), content TSRMLS_CC); RETURN_CCTOR(content); } } } /** * Create a virtual symbol table */ phalcon_create_symbol_table(TSRMLS_C); phalcon_ob_start(TSRMLS_C); PHALCON_OBS_VAR(view_params); phalcon_read_property_this(&view_params, this_ptr, SL("_viewParams"), PH_NOISY_CC); /** * Merge parameters */ if (Z_TYPE_P(params) == IS_ARRAY) { if (Z_TYPE_P(view_params) == IS_ARRAY) { PHALCON_INIT_VAR(merged_params); phalcon_fast_array_merge(merged_params, &view_params, ¶ms TSRMLS_CC); } else { PHALCON_CPY_WRT(merged_params, params); } } else { PHALCON_CPY_WRT(merged_params, view_params); } /** * internalRender is also reused by partials */ phalcon_call_method_p2_noret(this_ptr, "_internalrender", path, merged_params); /** * Store the data in output into the cache */ if (Z_TYPE_P(cache) == IS_OBJECT) { PHALCON_INIT_NVAR(is_started); phalcon_call_method(is_started, cache, "isstarted"); if (PHALCON_IS_TRUE(is_started)) { PHALCON_INIT_VAR(is_fresh); phalcon_call_method(is_fresh, cache, "isfresh"); if (PHALCON_IS_TRUE(is_fresh)) { phalcon_call_method_noret(cache, "save"); } else { phalcon_call_method_noret(cache, "stop"); } } else { phalcon_call_method_noret(cache, "stop"); } } phalcon_ob_end_clean(TSRMLS_C); PHALCON_OBS_NVAR(content); phalcon_read_property_this(&content, this_ptr, SL("_content"), PH_NOISY_CC); RETURN_CCTOR(content); }
/** * Renders a partial view * * <code> * //Show a partial inside another view * $this->partial('shared/footer'); * </code> * * <code> * //Show a partial inside another view with parameters * $this->partial('shared/footer', array('content' => $html)); * </code> * * @param string $partialPath * @param array $params */ PHP_METHOD(Phalcon_Mvc_View_Simple, partial){ zval *partial_path, *params = NULL, *view_params = NULL, *merged_params = NULL; zval *content; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 1, &partial_path, ¶ms); if (!params) { PHALCON_INIT_VAR(params); } /** * Start ouput buffering */ phalcon_ob_start(TSRMLS_C); /** * If the developer pass an array of variables we create a new virtual symbol table */ if (Z_TYPE_P(params) == IS_ARRAY) { PHALCON_OBS_VAR(view_params); phalcon_read_property_this(&view_params, this_ptr, SL("_viewParams"), PH_NOISY_CC); /** * Merge or assign the new params as parameters */ if (Z_TYPE_P(view_params) == IS_ARRAY) { PHALCON_INIT_VAR(merged_params); phalcon_fast_array_merge(merged_params, &view_params, ¶ms TSRMLS_CC); } else { PHALCON_CPY_WRT(merged_params, params); } /** * Create a virtual symbol table */ phalcon_create_symbol_table(TSRMLS_C); } else { PHALCON_CPY_WRT(merged_params, params); } /** * Call engine render, this checks in every registered engine for the partial */ phalcon_call_method_p2_noret(this_ptr, "_internalrender", partial_path, merged_params); /** * Now we need to restore the original view parameters */ if (view_params != NULL) { /** * Restore the original view params */ phalcon_update_property_this(this_ptr, SL("_viewParams"), view_params TSRMLS_CC); } phalcon_ob_end_clean(TSRMLS_C); PHALCON_OBS_VAR(content); phalcon_read_property_this(&content, this_ptr, SL("_content"), PH_NOISY_CC); /** * Content is output to the parent view */ zend_print_zval(content, 0); PHALCON_MM_RESTORE(); }
/** * Executes render process from dispatching data * *<code> * $view->start(); * //Shows recent posts view (app/views/posts/recent.phtml) * $view->render('posts', 'recent'); * $view->finish(); *</code> * * @param string $controllerName * @param string $actionName * @param array $params */ PHP_METHOD(Phalcon_Mvc_View, render){ zval *controller_name, *action_name, *params = NULL; zval *disabled, *contents = NULL, *layouts_dir = NULL, *layout; zval *layout_name = NULL, *engines, *pick_view, *render_view = NULL; zval *pick_view_action, *cache = NULL, *cache_level; zval *events_manager, *event_name = NULL, *status, *must_clean; zval *silence = NULL, *disabled_levels, *render_level; zval *enter_level = NULL, *templates_before, *template_before = NULL; zval *view_temp_path = NULL, *templates_after, *template_after = NULL; zval *main_view, *is_started, *is_fresh; zval *t0 = NULL, *t1 = NULL, *t2 = NULL, *t3 = NULL, *t4 = NULL; HashTable *ah0, *ah1; HashPosition hp0, hp1; zval **hd; PHALCON_MM_GROW(); phalcon_fetch_params(1, 2, 1, &controller_name, &action_name, ¶ms); if (!params) { PHALCON_INIT_VAR(params); } /** * If the view is disabled we simply update the buffer from any output produced in * the controller */ PHALCON_OBS_VAR(disabled); phalcon_read_property_this(&disabled, this_ptr, SL("_disabled"), PH_NOISY_CC); if (PHALCON_IS_NOT_FALSE(disabled)) { PHALCON_INIT_VAR(contents); PHALCON_CALL_FUNC(contents, "ob_get_contents"); phalcon_update_property_this(this_ptr, SL("_content"), contents TSRMLS_CC); RETURN_MM_FALSE; } phalcon_update_property_this(this_ptr, SL("_controllerName"), controller_name TSRMLS_CC); phalcon_update_property_this(this_ptr, SL("_actionName"), action_name TSRMLS_CC); phalcon_update_property_this(this_ptr, SL("_params"), params TSRMLS_CC); /** * Check if there is a layouts directory set */ PHALCON_OBS_VAR(layouts_dir); phalcon_read_property_this(&layouts_dir, this_ptr, SL("_layoutsDir"), PH_NOISY_CC); if (!zend_is_true(layouts_dir)) { PHALCON_INIT_NVAR(layouts_dir); ZVAL_STRING(layouts_dir, "layouts/", 1); } /** * Check if the user has defined a custom layout */ PHALCON_OBS_VAR(layout); phalcon_read_property_this(&layout, this_ptr, SL("_layout"), PH_NOISY_CC); if (zend_is_true(layout)) { PHALCON_CPY_WRT(layout_name, layout); } else { PHALCON_CPY_WRT(layout_name, controller_name); } /** * Load the template engines */ PHALCON_INIT_VAR(engines); PHALCON_CALL_METHOD(engines, this_ptr, "_loadtemplateengines"); /** * Check if the user has picked a view diferent than the automatic */ PHALCON_OBS_VAR(pick_view); phalcon_read_property_this(&pick_view, this_ptr, SL("_pickView"), PH_NOISY_CC); if (Z_TYPE_P(pick_view) == IS_NULL) { PHALCON_INIT_VAR(render_view); PHALCON_CONCAT_VSV(render_view, controller_name, "/", action_name); } else { /** * The 'picked' view is an array, where the first element is controller and the * second the action */ PHALCON_OBS_NVAR(render_view); phalcon_array_fetch_long(&render_view, pick_view, 0, PH_NOISY_CC); if (phalcon_array_isset_long(pick_view, 1)) { PHALCON_OBS_VAR(pick_view_action); phalcon_array_fetch_long(&pick_view_action, pick_view, 1, PH_NOISY_CC); PHALCON_CPY_WRT(layout_name, pick_view_action); } } PHALCON_INIT_VAR(cache); /** * Start the cache if there is a cache level enabled */ PHALCON_OBS_VAR(cache_level); phalcon_read_property_this(&cache_level, this_ptr, SL("_cacheLevel"), PH_NOISY_CC); if (zend_is_true(cache_level)) { PHALCON_CALL_METHOD(cache, this_ptr, "getcache"); } PHALCON_OBS_VAR(events_manager); phalcon_read_property_this(&events_manager, this_ptr, SL("_eventsManager"), PH_NOISY_CC); /** * Create a virtual symbol table */ phalcon_create_symbol_table(TSRMLS_C); /** * Call beforeRender if there is an events manager */ if (Z_TYPE_P(events_manager) == IS_OBJECT) { PHALCON_INIT_VAR(event_name); ZVAL_STRING(event_name, "view:beforeRender", 1); PHALCON_INIT_VAR(status); PHALCON_CALL_METHOD_PARAMS_2(status, events_manager, "fire", event_name, this_ptr); if (PHALCON_IS_FALSE(status)) { RETURN_MM_FALSE; } } /** * Get the current content in the buffer maybe some output from the controller */ PHALCON_INIT_NVAR(contents); PHALCON_CALL_FUNC(contents, "ob_get_contents"); phalcon_update_property_this(this_ptr, SL("_content"), contents TSRMLS_CC); PHALCON_INIT_VAR(must_clean); ZVAL_BOOL(must_clean, 1); PHALCON_INIT_VAR(silence); ZVAL_BOOL(silence, 1); /** * Disabled levels allow to avoid an specific level of rendering */ PHALCON_OBS_VAR(disabled_levels); phalcon_read_property_this(&disabled_levels, this_ptr, SL("_disabledLevels"), PH_NOISY_CC); /** * Render level will tell use when to stop */ PHALCON_OBS_VAR(render_level); phalcon_read_property_this(&render_level, this_ptr, SL("_renderLevel"), PH_NOISY_CC); if (zend_is_true(render_level)) { /** * Inserts view related to action */ PHALCON_INIT_VAR(t0); ZVAL_LONG(t0, 1); PHALCON_INIT_VAR(enter_level); is_smaller_or_equal_function(enter_level, t0, render_level TSRMLS_CC); if (PHALCON_IS_TRUE(enter_level)) { if (!phalcon_array_isset_long(disabled_levels, 1)) { PHALCON_CALL_METHOD_PARAMS_5_NORETURN(this_ptr, "_enginerender", engines, render_view, silence, must_clean, cache); } } /** * Inserts templates before layout */ PHALCON_INIT_VAR(t1); ZVAL_LONG(t1, 2); PHALCON_INIT_NVAR(enter_level); is_smaller_or_equal_function(enter_level, t1, render_level TSRMLS_CC); if (PHALCON_IS_TRUE(enter_level)) { if (!phalcon_array_isset_long(disabled_levels, 2)) { PHALCON_OBS_VAR(templates_before); phalcon_read_property_this(&templates_before, this_ptr, SL("_templatesBefore"), PH_NOISY_CC); /** * Templates before must be an array */ if (Z_TYPE_P(templates_before) == IS_ARRAY) { ZVAL_BOOL(silence, 0); if (!phalcon_is_iterable(templates_before, &ah0, &hp0, 0, 0 TSRMLS_CC)) { return; } while (zend_hash_get_current_data_ex(ah0, (void**) &hd, &hp0) == SUCCESS) { PHALCON_GET_FOREACH_VALUE(template_before); PHALCON_INIT_NVAR(view_temp_path); PHALCON_CONCAT_VV(view_temp_path, layouts_dir, template_before); PHALCON_CALL_METHOD_PARAMS_5_NORETURN(this_ptr, "_enginerender", engines, view_temp_path, silence, must_clean, cache); zend_hash_move_forward_ex(ah0, &hp0); } ZVAL_BOOL(silence, 1); } } } /** * Inserts controller layout */ PHALCON_INIT_VAR(t2); ZVAL_LONG(t2, 3); PHALCON_INIT_NVAR(enter_level); is_smaller_or_equal_function(enter_level, t2, render_level TSRMLS_CC); if (PHALCON_IS_TRUE(enter_level)) { if (!phalcon_array_isset_long(disabled_levels, 3)) { PHALCON_INIT_NVAR(view_temp_path); PHALCON_CONCAT_VV(view_temp_path, layouts_dir, layout_name); PHALCON_CALL_METHOD_PARAMS_5_NORETURN(this_ptr, "_enginerender", engines, view_temp_path, silence, must_clean, cache); } } /** * Inserts templates after layout */ PHALCON_INIT_VAR(t3); ZVAL_LONG(t3, 4); PHALCON_INIT_NVAR(enter_level); is_smaller_or_equal_function(enter_level, t3, render_level TSRMLS_CC); if (PHALCON_IS_TRUE(enter_level)) { if (!phalcon_array_isset_long(disabled_levels, 4)) { /** * Templates after must be an array */ PHALCON_OBS_VAR(templates_after); phalcon_read_property_this(&templates_after, this_ptr, SL("_templatesAfter"), PH_NOISY_CC); if (Z_TYPE_P(templates_after) == IS_ARRAY) { ZVAL_BOOL(silence, 0); if (!phalcon_is_iterable(templates_after, &ah1, &hp1, 0, 0 TSRMLS_CC)) { return; } while (zend_hash_get_current_data_ex(ah1, (void**) &hd, &hp1) == SUCCESS) { PHALCON_GET_FOREACH_VALUE(template_after); PHALCON_INIT_NVAR(view_temp_path); PHALCON_CONCAT_VV(view_temp_path, layouts_dir, template_after); PHALCON_CALL_METHOD_PARAMS_5_NORETURN(this_ptr, "_enginerender", engines, view_temp_path, silence, must_clean, cache); zend_hash_move_forward_ex(ah1, &hp1); } ZVAL_BOOL(silence, 1); } } } /** * Inserts main view */ PHALCON_INIT_VAR(t4); ZVAL_LONG(t4, 5); PHALCON_INIT_NVAR(enter_level); is_smaller_or_equal_function(enter_level, t4, render_level TSRMLS_CC); if (PHALCON_IS_TRUE(enter_level)) { if (!phalcon_array_isset_long(disabled_levels, 5)) { PHALCON_OBS_VAR(main_view); phalcon_read_property_this(&main_view, this_ptr, SL("_mainView"), PH_NOISY_CC); PHALCON_CALL_METHOD_PARAMS_5_NORETURN(this_ptr, "_enginerender", engines, main_view, silence, must_clean, cache); } } /** * Store the data in the cache */ if (Z_TYPE_P(cache) == IS_OBJECT) { PHALCON_INIT_VAR(is_started); PHALCON_CALL_METHOD(is_started, cache, "isstarted"); if (PHALCON_IS_TRUE(is_started)) { PHALCON_INIT_VAR(is_fresh); PHALCON_CALL_METHOD(is_fresh, cache, "isfresh"); if (PHALCON_IS_TRUE(is_fresh)) { PHALCON_CALL_METHOD_NORETURN(cache, "save"); } else { PHALCON_CALL_METHOD_NORETURN(cache, "stop"); } } else { PHALCON_CALL_METHOD_NORETURN(cache, "stop"); } } } /** * Call afterRender event */ if (Z_TYPE_P(events_manager) == IS_OBJECT) { PHALCON_INIT_NVAR(event_name); ZVAL_STRING(event_name, "view:afterRender", 1); PHALCON_CALL_METHOD_PARAMS_2_NORETURN(events_manager, "fire", event_name, this_ptr); } RETURN_MM_NULL(); }