Yii generating wrong link - hyperlink

I want to add a link to a PDF file but instead of printing the link, Yii simply prints my link code
$this->widget('zii.widgets.CDetailView', array(
'data'=>$model,
'attributes'=>array(
'usrname',
array(
'name'=>'module_id',
'value'=>$model->ModelName('module_id')
),
'filename',
'desc',
array(
'name'=>'state_id',
'value'=>$model->StateName('state_id')
),
'dtop',
array(
'label'=>'path',
'value'=> CHtml::link(CHtml::encode($model->path), 'c:/xampp/htdocs'.Yii::app()->baseUrl . '/upload/' . $model->path)
)
),
));
and output is something like
User name :harpreet
Module :CSD Admin
File name :cvcxv
Description :sdsdfs
State :Creation
Date of publish :2012-03-28 13:48:43
path :1index.php.txt

Use the type property of CDataColumn, and your type will be raw.
array(
'label'=>'path',
'value'=> CHtml::link(CHtml::encode($model->path), 'c:/xampp/htdocs'.Yii::app()->baseUrl . '/upload/' . $model->path),
'type'=>'raw'
)

Related

Get new instances of ZF2 ViewHelper/Form/etc

Is it possible to get a new instance of a ZF2 View Helper, Form and the like on each call?
My main issue at the moment is with view helpers. Each time I call the helper I need it to be constructed as need to have new objects passed into it but it doesn't matter what config I have it only ever passes through the factory the once.
With that the objects which are generated via the factory are the same for each instance, which Is not what I'm wanting.
I've tried various configs such as setting the view helper as shared, but that hasn't helped.
This is my config as it currently stands;
/**
*
*/
'view_helpers' => array(
'shared' => array(
'notes' => false,
),
'factories' => array(
'notes' => __NAMESPACE__ . '\Factory\ViewHelper\Notes',
'note' => __NAMESPACE__ . '\Factory\ViewHelper\Note',
)
),
Any help would be great!
You're almost there.
The shared config key is to mark the services that require a new instance to be created each time you request them.
The problem however, is that you have to use the service name.
'view_helpers' => [
'shared' => [
'notes' => false,
],
'factories' => [
'notes' => __NAMESPACE__ . '\Factory\ViewHelper\Notes',
],
],

zf2 translate validators messages with variables

I have custom message like this:
'options' => array(
'min' => $min,
'max' => $date->format('Y-m-d'),
'inclusive' => true,
'messages' => array(
Between::NOT_BETWEEN => "The input is not between '%min%' and '%max%', inclusively",
),
),
I put this string in .po file and generate .mo, but message won't translate. For all other messages without variables it's working fine.
You can read in the ZF2 official documentation on how to do this.
The translation files for validators are located at /resources/languages. You should simply attach a translator to Zend\Validator\AbstractValidator using these resource files or in your case your own file for your custom messages.
$validator->setDefaultTranslator($translator);
EDIT
I misinterpreted your question, here an edit
Can you not translate the message before binding the variables like this:
$translator = ...translator...
'options' => array(
'min' => $min,
'max' => $date->format('Y-m-d'),
'inclusive' => true,
'messages' => array(
Between::NOT_BETWEEN => $translator->translate(
"The input is not between '%min%' and '%max%', inclusively"
),
),
),
It would have been nice, if you had given more explanation.
Generally If string contains variables , You have to replace them with string formatters.
In your case msgid "The input is not between %s and %s"
I hope it should solve your problem.

How to put translator in Zend2 form

Iam new guy to Zend framework and currently Iam working on Zend2...I want to ask about Translator usage in Zend forms....If i want to use translator i directly using for labels in form view i.e.form_view.php like
$this->formLabel()->setTranslator($translator, 'date_of_birth');
But I want to add the translator at the form only i.e.in src/my_module/Form/UserForm.php
like
$this->add(array(
'name' => 'date_of_birth',
'attributes' => array(
'type' => 'text',
'id' => 'date_of_birth',
),
'options' => array(
'label' => 'DateOfBirth',
), //Here there is any option to put translator
));
Please help me...any answer would be help for me like I asked
Thanks in advance
You don't really need to do that. Since the the Translator that is set up using the factory-key translator will automatically be injected into the Form.
The best approach (in my opinion) is to make extensive use of the translator text_domain:
'translator' => array(
'locale' => 'de_DE',
'translation_file_patterns' => array(
array(
'type' => 'phparray',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s.php',
'text_domain' => 'MyModuleTextDomain'
),
),
),
With this setup, the Files of your Module will automatically be inserted into the default TranslatorService which every Zend\Form knows of.
So ultimately all you have to do is make the ViewHelpers know of the TextDomain that you are using. And this is done in the following manner:
$this->formLabel()->setTranslatorTextDomain('MyModuleTextDomain');
$this->formButton()->setTranslatorTextDomain('MyModuleTextDomain');
$this->formElementErrors()->setTranslatorTextDomain('MyModuleTextDomain');
You need to do this once inside your respective view.phtml before(!) using the ViewHelpers like $this->formElement($element) or $this->formCollection($form)
And that's really all there is to it. I recall having seen a discussion somewhere about making it easier to pass along Text-Domain-Data, but i can't find it right now. So things may get a little easier in the future ;) For now, 3 lines are all that's needed though!
above answer is quite unnecessary ... as your translator was added automatically to zend form for rendering form labels and ....
only use this code in your module config :
'translator' => array(
'locale' => 'en_US',
'translation_file_patterns' => array(
array(
'type' => 'phparray',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s.php',
),
),
),
if u use the correct view helpers for rendering form elements (or whole form) it will automatically translated
This is not a recommended approach because forms are translated automatically if you have a translator configured (which you do if you are using the Skeleton Application). However, since you asked how to use the translator directly within your form, I will show you how you can do it. Please carefully consider if you really want to do this, as I cannot imagine a use case where it would be necessary.
To do exactly what you were asking, you can inject the translator into your form. You can do this either in your controller or in a factory. I will be using a factory in this example because it is more DRY.
// In your module's config file
'service_manager' => array(
'factories' => array(
'YourModule\Form\YourForm' => function($sm) {
$translator = $sm->get('Translator');
return new \YourModule\Form\YourForm($translator);
},
),
),
Then in your form class, you can do like this:
namespace YourModule\Form;
class RegisterForm extends \Zend\Form\Form {
public function __construct($translator) {
// Do something
$translated_string = $translator->translate('string to translate');
}
}
Then in your controller, you can do like this:
$your_form = $this->servicelocator->get('YourModule\Form\YourForm');
Or if you don't want to use the factory, you can choose to not add it and do like this instead:
$your_form = new \YourModule\Form\YourForm($this->servicelocator->get('Translator'));
I would recommend going with the factory, though.

Zend framework 2, pagination routing issue

I have issue on zend pagination and routing in zf2 . I would like to display details of feedback item , and list of its sub items ( actions ) on the same page . My route code is given below
$routes['dashboard_inbox_actions'] = array(
'type' => 'segment',
'options' => array(
'route' => '/dashboard/inbox/detail[/:feedback[/actions/page/:page]]',
'constraints' => array(
'feedback' => '[0-9]+',
'page' => '[0-9]+',
),
'defaults' => array(
'__NAMESPACE__' => 'Dashboard\Controller',
'controller' => 'inbox' ,
'action' => 'detail',
'feedback' => 0 ,
'page' => 1
),
),
);
I pass url like
/dashboard/inbox/detail/4
in listing page , for rendering the provided pages of subitems .
<?php echo $this->paginationControl($this->paginator, 'Sliding' ); ?>
which creates paging urls , with feedback id as 0 ( it my issue )
/dashboard/inbox/detail/0/actions/page/2
/dashboard/inbox/detail/0/actions/page/3
I manually paste url
/dashboard/inbox/detail/4/actions/page/2
Its shows page 2 as active item . My controller code works fine and gives me result , but still paginationControl creates url with feedback id 0.
You need to use the fourth parameter of the paginationControl view helper:
<?php
echo $this->paginationControl($this->paginator, 'Sliding',
'my_pagination_control', array('route' => 'paginator_route'));
?>
You can pass through parameters to the view partial, for example pass through your route name so you can generate yoru links using the correct route.
then inside your view partial you can use this in the url helper:
<?php echo $this->url($this->route, array('page' => $this->first), FALSE, TRUE) ?>
see: http://framework.zend.com/manual/2.0/en/modules/zend.view.helpers.html#url-helper
where you can see the url helper can use currently matches params:
url($name, $urlParams, $routeOptions, $reuseMatchedParams)
Setting $reuseMatchedParams to true will allow the use of the current matched params as default values.

Zend Framework 2 (ZF2) dynamic locale

I am looking for a way to add translations to my ZF2 application, using globals in my URL.
Is there anyway to do this for the whole application at once?
A typpical URL would look like this: http://domain.com/en_GB/user/index
The first part (en_GB) should be used to show the correct translation.
Besides that, it would be nice, if it is possible to set this router part optional.
So, if I should go to http://domain.com/user/index (without the locale part) to my application, it should automatically take the browser locale.
I hope I am clear enough, if any additions are needed to this question, feel free to ask.
Thanx in advance
#DrBeza,
Thank you for your answer. I don't know if this is the correct way, but I created the next solution:
in /config/global.php I added this part
'translator' => array(
'locale' => 'nl_NL',
'translation_file_patterns' => array(
array(
'type' => 'phpArray',
'base_dir' => __DIR__ . '/../../language',
'pattern' => '%s.php',
),
),
),
in /module/[modulename]/config/module.config.php I added this part to set the first part of the URL containing the locale
'router' => array(
'routes' => array(
'user' => array(
'options' => array(
'route' => '[/:lang]/user[/:action][/:id]',
'constraints' => array(
'lang' => '([a-z]{2})+(_)+([A-Z]{2})',
),
),
),
),
),
in /config/local.php I added this code to fetch the locale from the URL:
http://domain.com/[locale][module][controller]
$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$segment = explode('/', $_SERVER['REQUEST_URI_PATH']);
And I added this part to load the locale dynamicly:
return array(
'translator' => array(
'locale' => $segment[1],
);
I would suggest extending the Segment route class and adding in the optional locale constraint and segment part if missing. Call the optional variable something application wide such as 'locale'.
Then create a 'route' event in the main module bootstrap, this event will fire once a route has been matched. The callback function that is fired will have access to the RouteMatch object through the passed event, letting you gain access to the 'locale' value. Then you can do some checks and set the application locale.

Resources